| OLD | NEW |
| (Empty) |
| 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. | |
| 4 | |
| 5 #include "base/memory/scoped_ptr.h" | |
| 6 #include "chrome/browser/extensions/api/bluetooth_low_energy/bluetooth_low_energ
y_api.h" | |
| 7 #include "chrome/browser/extensions/api/bluetooth_low_energy/bluetooth_low_energ
y_event_router.h" | |
| 8 #include "chrome/browser/extensions/extension_apitest.h" | |
| 9 #include "chrome/browser/extensions/extension_function_test_utils.h" | |
| 10 #include "chrome/browser/extensions/extension_test_message_listener.h" | |
| 11 #include "device/bluetooth/test/mock_bluetooth_adapter.h" | |
| 12 #include "device/bluetooth/test/mock_bluetooth_device.h" | |
| 13 #include "device/bluetooth/test/mock_bluetooth_gatt_characteristic.h" | |
| 14 #include "device/bluetooth/test/mock_bluetooth_gatt_connection.h" | |
| 15 #include "device/bluetooth/test/mock_bluetooth_gatt_descriptor.h" | |
| 16 #include "device/bluetooth/test/mock_bluetooth_gatt_notify_session.h" | |
| 17 #include "device/bluetooth/test/mock_bluetooth_gatt_service.h" | |
| 18 #include "testing/gmock/include/gmock/gmock.h" | |
| 19 | |
| 20 using device::BluetoothUUID; | |
| 21 using device::BluetoothAdapter; | |
| 22 using device::BluetoothDevice; | |
| 23 using device::BluetoothGattCharacteristic; | |
| 24 using device::BluetoothGattConnection; | |
| 25 using device::BluetoothGattDescriptor; | |
| 26 using device::BluetoothGattService; | |
| 27 using device::BluetoothGattNotifySession; | |
| 28 using device::MockBluetoothAdapter; | |
| 29 using device::MockBluetoothDevice; | |
| 30 using device::MockBluetoothGattCharacteristic; | |
| 31 using device::MockBluetoothGattConnection; | |
| 32 using device::MockBluetoothGattDescriptor; | |
| 33 using device::MockBluetoothGattService; | |
| 34 using device::MockBluetoothGattNotifySession; | |
| 35 using extensions::BluetoothLowEnergyEventRouter; | |
| 36 using testing::Invoke; | |
| 37 using testing::Return; | |
| 38 using testing::ReturnRef; | |
| 39 using testing::ReturnRefOfCopy; | |
| 40 using testing::SaveArg; | |
| 41 using testing::_; | |
| 42 | |
| 43 namespace utils = extension_function_test_utils; | |
| 44 | |
| 45 namespace { | |
| 46 | |
| 47 // Test service constants. | |
| 48 const char kTestLeDeviceAddress0[] = "11:22:33:44:55:66"; | |
| 49 const char kTestLeDeviceName0[] = "Test LE Device 0"; | |
| 50 | |
| 51 const char kTestLeDeviceAddress1[] = "77:88:99:AA:BB:CC"; | |
| 52 const char kTestLeDeviceName1[] = "Test LE Device 1"; | |
| 53 | |
| 54 const char kTestServiceId0[] = "service_id0"; | |
| 55 const char kTestServiceUuid0[] = "1234"; | |
| 56 | |
| 57 const char kTestServiceId1[] = "service_id1"; | |
| 58 const char kTestServiceUuid1[] = "5678"; | |
| 59 | |
| 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}; | |
| 69 | |
| 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}; | |
| 77 | |
| 78 const char kTestCharacteristicId2[] = "char_id2"; | |
| 79 const char kTestCharacteristicUuid2[] = "1213"; | |
| 80 const BluetoothGattCharacteristic::Properties kTestCharacteristicProperties2 = | |
| 81 BluetoothGattCharacteristic::kPropertyNone; | |
| 82 | |
| 83 // Test descriptor constants. | |
| 84 const char kTestDescriptorId0[] = "desc_id0"; | |
| 85 const char kTestDescriptorUuid0[] = "1221"; | |
| 86 const uint8 kTestDescriptorDefaultValue0[] = {0x01, 0x02, 0x03}; | |
| 87 | |
| 88 const char kTestDescriptorId1[] = "desc_id1"; | |
| 89 const char kTestDescriptorUuid1[] = "1222"; | |
| 90 const uint8 kTestDescriptorDefaultValue1[] = {0x04, 0x05}; | |
| 91 | |
| 92 class BluetoothLowEnergyApiTest : public ExtensionApiTest { | |
| 93 public: | |
| 94 BluetoothLowEnergyApiTest() {} | |
| 95 | |
| 96 virtual ~BluetoothLowEnergyApiTest() {} | |
| 97 | |
| 98 virtual void SetUpOnMainThread() OVERRIDE { | |
| 99 ExtensionApiTest::SetUpOnMainThread(); | |
| 100 empty_extension_ = utils::CreateEmptyExtension(); | |
| 101 SetUpMocks(); | |
| 102 } | |
| 103 | |
| 104 virtual void TearDownOnMainThread() OVERRIDE { | |
| 105 EXPECT_CALL(*mock_adapter_, RemoveObserver(_)); | |
| 106 } | |
| 107 | |
| 108 void SetUpMocks() { | |
| 109 mock_adapter_ = new testing::StrictMock<MockBluetoothAdapter>(); | |
| 110 EXPECT_CALL(*mock_adapter_, GetDevices()) | |
| 111 .WillOnce(Return(BluetoothAdapter::ConstDeviceList())); | |
| 112 | |
| 113 event_router()->SetAdapterForTesting(mock_adapter_); | |
| 114 | |
| 115 device0_.reset( | |
| 116 new testing::NiceMock<MockBluetoothDevice>(mock_adapter_, | |
| 117 0, | |
| 118 kTestLeDeviceName0, | |
| 119 kTestLeDeviceAddress0, | |
| 120 false /* paired */, | |
| 121 true /* connected */)); | |
| 122 | |
| 123 device1_.reset( | |
| 124 new testing::NiceMock<MockBluetoothDevice>(mock_adapter_, | |
| 125 0, | |
| 126 kTestLeDeviceName1, | |
| 127 kTestLeDeviceAddress1, | |
| 128 false /* paired */, | |
| 129 false /* connected */)); | |
| 130 | |
| 131 service0_.reset(new testing::NiceMock<MockBluetoothGattService>( | |
| 132 device0_.get(), | |
| 133 kTestServiceId0, | |
| 134 BluetoothUUID(kTestServiceUuid0), | |
| 135 true /* is_primary */, | |
| 136 false /* is_local */)); | |
| 137 | |
| 138 service1_.reset(new testing::NiceMock<MockBluetoothGattService>( | |
| 139 device0_.get(), | |
| 140 kTestServiceId1, | |
| 141 BluetoothUUID(kTestServiceUuid1), | |
| 142 false /* is_primary */, | |
| 143 false /* is_local */)); | |
| 144 | |
| 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>( | |
| 151 service0_.get(), | |
| 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)); | |
| 161 | |
| 162 chrc1_.reset(new testing::NiceMock<MockBluetoothGattCharacteristic>( | |
| 163 service0_.get(), | |
| 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)); | |
| 173 | |
| 174 chrc2_.reset(new testing::NiceMock<MockBluetoothGattCharacteristic>( | |
| 175 service1_.get(), | |
| 176 kTestCharacteristicId2, | |
| 177 BluetoothUUID(kTestCharacteristicUuid2), | |
| 178 false /* is_local */, | |
| 179 kTestCharacteristicProperties2, | |
| 180 BluetoothGattCharacteristic::kPermissionNone)); | |
| 181 | |
| 182 desc0_.reset(new testing::NiceMock<MockBluetoothGattDescriptor>( | |
| 183 chrc0_.get(), | |
| 184 kTestDescriptorId0, | |
| 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)); | |
| 192 | |
| 193 desc1_.reset(new testing::NiceMock<MockBluetoothGattDescriptor>( | |
| 194 chrc0_.get(), | |
| 195 kTestDescriptorId1, | |
| 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)); | |
| 203 } | |
| 204 | |
| 205 protected: | |
| 206 BluetoothLowEnergyEventRouter* event_router() { | |
| 207 return extensions::BluetoothLowEnergyAPI::Get(browser()->profile()) | |
| 208 ->event_router(); | |
| 209 } | |
| 210 | |
| 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_; | |
| 221 | |
| 222 private: | |
| 223 scoped_refptr<extensions::Extension> empty_extension_; | |
| 224 }; | |
| 225 | |
| 226 ACTION_TEMPLATE(InvokeCallbackArgument, | |
| 227 HAS_1_TEMPLATE_PARAMS(int, k), | |
| 228 AND_0_VALUE_PARAMS()) { | |
| 229 ::std::tr1::get<k>(args).Run(); | |
| 230 } | |
| 231 | |
| 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); | |
| 236 } | |
| 237 | |
| 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)); | |
| 242 } | |
| 243 | |
| 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); | |
| 249 | |
| 250 if (expect_disconnect) { | |
| 251 EXPECT_CALL(*conn, Disconnect(_)) | |
| 252 .Times(1) | |
| 253 .WillOnce(InvokeCallbackArgument<0>()); | |
| 254 } else { | |
| 255 EXPECT_CALL(*conn, Disconnect(_)).Times(0); | |
| 256 } | |
| 257 | |
| 258 return conn; | |
| 259 } | |
| 260 | |
| 261 IN_PROC_BROWSER_TEST_F(BluetoothLowEnergyApiTest, GetServices) { | |
| 262 ResultCatcher catcher; | |
| 263 catcher.RestrictToProfile(browser()->profile()); | |
| 264 | |
| 265 std::vector<BluetoothGattService*> services; | |
| 266 services.push_back(service0_.get()); | |
| 267 services.push_back(service1_.get()); | |
| 268 | |
| 269 EXPECT_CALL(*mock_adapter_, GetDevice(_)) | |
| 270 .Times(3) | |
| 271 .WillOnce(Return(static_cast<BluetoothDevice*>(NULL))) | |
| 272 .WillRepeatedly(Return(device0_.get())); | |
| 273 | |
| 274 EXPECT_CALL(*device0_, GetGattServices()) | |
| 275 .Times(2) | |
| 276 .WillOnce(Return(std::vector<BluetoothGattService*>())) | |
| 277 .WillOnce(Return(services)); | |
| 278 | |
| 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()); | |
| 284 | |
| 285 listener.Reply("go"); | |
| 286 | |
| 287 EXPECT_TRUE(catcher.GetNextResult()) << catcher.message(); | |
| 288 } | |
| 289 | |
| 290 IN_PROC_BROWSER_TEST_F(BluetoothLowEnergyApiTest, GetService) { | |
| 291 ResultCatcher catcher; | |
| 292 catcher.RestrictToProfile(browser()->profile()); | |
| 293 | |
| 294 event_router()->GattServiceAdded( | |
| 295 mock_adapter_, device0_.get(), service0_.get()); | |
| 296 | |
| 297 EXPECT_CALL(*mock_adapter_, GetDevice(_)) | |
| 298 .Times(3) | |
| 299 .WillOnce(Return(static_cast<BluetoothDevice*>(NULL))) | |
| 300 .WillRepeatedly(Return(device0_.get())); | |
| 301 | |
| 302 EXPECT_CALL(*device0_, GetGattService(kTestServiceId0)) | |
| 303 .Times(2) | |
| 304 .WillOnce(Return(static_cast<BluetoothGattService*>(NULL))) | |
| 305 .WillOnce(Return(service0_.get())); | |
| 306 | |
| 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()); | |
| 312 | |
| 313 listener.Reply("go"); | |
| 314 | |
| 315 EXPECT_TRUE(catcher.GetNextResult()) << catcher.message(); | |
| 316 | |
| 317 event_router()->GattServiceRemoved( | |
| 318 mock_adapter_, device0_.get(), service0_.get()); | |
| 319 } | |
| 320 | |
| 321 IN_PROC_BROWSER_TEST_F(BluetoothLowEnergyApiTest, ServiceEvents) { | |
| 322 ResultCatcher catcher; | |
| 323 catcher.RestrictToProfile(browser()->profile()); | |
| 324 | |
| 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"))); | |
| 329 | |
| 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()); | |
| 335 | |
| 336 // These will send the onServiceAdded event to apps. | |
| 337 event_router()->GattDiscoveryCompleteForService(mock_adapter_, | |
| 338 service0_.get()); | |
| 339 event_router()->GattDiscoveryCompleteForService(mock_adapter_, | |
| 340 service1_.get()); | |
| 341 | |
| 342 // This will send the onServiceChanged event to apps. | |
| 343 event_router()->GattServiceChanged(mock_adapter_, service1_.get()); | |
| 344 | |
| 345 // This will send the onServiceRemoved event to apps. | |
| 346 event_router()->GattServiceRemoved( | |
| 347 mock_adapter_, device0_.get(), service0_.get()); | |
| 348 | |
| 349 EXPECT_TRUE(listener.WaitUntilSatisfied()); | |
| 350 listener.Reply("go"); | |
| 351 | |
| 352 EXPECT_TRUE(catcher.GetNextResult()) << catcher.message(); | |
| 353 event_router()->GattServiceRemoved( | |
| 354 mock_adapter_, device0_.get(), service1_.get()); | |
| 355 } | |
| 356 | |
| 357 IN_PROC_BROWSER_TEST_F(BluetoothLowEnergyApiTest, GetRemovedService) { | |
| 358 ResultCatcher catcher; | |
| 359 catcher.RestrictToProfile(browser()->profile()); | |
| 360 | |
| 361 // Load the extension and let it set up. | |
| 362 ASSERT_TRUE(LoadExtension( | |
| 363 test_data_dir_.AppendASCII("bluetooth_low_energy/get_removed_service"))); | |
| 364 | |
| 365 // 1. getService success. | |
| 366 EXPECT_CALL(*mock_adapter_, GetDevice(_)) | |
| 367 .Times(1) | |
| 368 .WillOnce(Return(device0_.get())); | |
| 369 EXPECT_CALL(*device0_, GetGattService(kTestServiceId0)) | |
| 370 .Times(1) | |
| 371 .WillOnce(Return(service0_.get())); | |
| 372 | |
| 373 event_router()->GattServiceAdded( | |
| 374 mock_adapter_, device0_.get(), service0_.get()); | |
| 375 event_router()->GattDiscoveryCompleteForService(mock_adapter_, | |
| 376 service0_.get()); | |
| 377 | |
| 378 ExtensionTestMessageListener get_service_success_listener("getServiceSuccess", | |
| 379 true); | |
| 380 EXPECT_TRUE(get_service_success_listener.WaitUntilSatisfied()); | |
| 381 testing::Mock::VerifyAndClearExpectations(mock_adapter_); | |
| 382 testing::Mock::VerifyAndClearExpectations(device0_.get()); | |
| 383 | |
| 384 // 2. getService fail. | |
| 385 EXPECT_CALL(*mock_adapter_, GetDevice(_)).Times(0); | |
| 386 EXPECT_CALL(*device0_, GetGattService(kTestServiceId0)).Times(0); | |
| 387 | |
| 388 event_router()->GattServiceRemoved( | |
| 389 mock_adapter_, device0_.get(), service0_.get()); | |
| 390 | |
| 391 ExtensionTestMessageListener get_service_fail_listener("getServiceFail", | |
| 392 true); | |
| 393 EXPECT_TRUE(get_service_fail_listener.WaitUntilSatisfied()); | |
| 394 testing::Mock::VerifyAndClearExpectations(mock_adapter_); | |
| 395 testing::Mock::VerifyAndClearExpectations(device0_.get()); | |
| 396 | |
| 397 get_service_fail_listener.Reply("go"); | |
| 398 | |
| 399 EXPECT_TRUE(catcher.GetNextResult()) << catcher.message(); | |
| 400 } | |
| 401 | |
| 402 IN_PROC_BROWSER_TEST_F(BluetoothLowEnergyApiTest, GetIncludedServices) { | |
| 403 ResultCatcher catcher; | |
| 404 catcher.RestrictToProfile(browser()->profile()); | |
| 405 | |
| 406 ASSERT_TRUE(LoadExtension(test_data_dir_.AppendASCII( | |
| 407 "bluetooth_low_energy/get_included_services"))); | |
| 408 | |
| 409 // Wait for initial call to end with failure as there is no mapping. | |
| 410 ExtensionTestMessageListener listener("ready", true); | |
| 411 EXPECT_TRUE(listener.WaitUntilSatisfied()); | |
| 412 | |
| 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()); | |
| 418 | |
| 419 std::vector<BluetoothGattService*> includes; | |
| 420 includes.push_back(service1_.get()); | |
| 421 EXPECT_CALL(*mock_adapter_, GetDevice(kTestLeDeviceAddress0)) | |
| 422 .Times(2) | |
| 423 .WillRepeatedly(Return(device0_.get())); | |
| 424 EXPECT_CALL(*device0_, GetGattService(kTestServiceId0)) | |
| 425 .Times(2) | |
| 426 .WillRepeatedly(Return(service0_.get())); | |
| 427 EXPECT_CALL(*service0_, GetIncludedServices()) | |
| 428 .Times(2) | |
| 429 .WillOnce(Return(std::vector<BluetoothGattService*>())) | |
| 430 .WillOnce(Return(includes)); | |
| 431 | |
| 432 listener.Reply("go"); | |
| 433 listener.Reset(); | |
| 434 | |
| 435 EXPECT_TRUE(listener.WaitUntilSatisfied()); | |
| 436 | |
| 437 listener.Reply("go"); | |
| 438 | |
| 439 EXPECT_TRUE(catcher.GetNextResult()) << catcher.message(); | |
| 440 event_router()->GattServiceRemoved( | |
| 441 mock_adapter_, device0_.get(), service0_.get()); | |
| 442 } | |
| 443 | |
| 444 IN_PROC_BROWSER_TEST_F(BluetoothLowEnergyApiTest, GetCharacteristics) { | |
| 445 ResultCatcher catcher; | |
| 446 catcher.RestrictToProfile(browser()->profile()); | |
| 447 | |
| 448 std::vector<BluetoothGattCharacteristic*> characteristics; | |
| 449 characteristics.push_back(chrc0_.get()); | |
| 450 characteristics.push_back(chrc1_.get()); | |
| 451 | |
| 452 event_router()->GattServiceAdded( | |
| 453 mock_adapter_, device0_.get(), service0_.get()); | |
| 454 | |
| 455 EXPECT_CALL(*mock_adapter_, GetDevice(_)).Times(3).WillRepeatedly( | |
| 456 Return(device0_.get())); | |
| 457 EXPECT_CALL(*device0_, GetGattService(kTestServiceId0)) | |
| 458 .Times(3) | |
| 459 .WillOnce(Return(static_cast<BluetoothGattService*>(NULL))) | |
| 460 .WillRepeatedly(Return(service0_.get())); | |
| 461 EXPECT_CALL(*service0_, GetCharacteristics()) | |
| 462 .Times(2) | |
| 463 .WillOnce(Return(std::vector<BluetoothGattCharacteristic*>())) | |
| 464 .WillOnce(Return(characteristics)); | |
| 465 | |
| 466 ExtensionTestMessageListener listener("ready", true); | |
| 467 ASSERT_TRUE(LoadExtension( | |
| 468 test_data_dir_.AppendASCII("bluetooth_low_energy/get_characteristics"))); | |
| 469 EXPECT_TRUE(listener.WaitUntilSatisfied()); | |
| 470 | |
| 471 listener.Reply("go"); | |
| 472 | |
| 473 EXPECT_TRUE(catcher.GetNextResult()) << catcher.message(); | |
| 474 event_router()->GattServiceRemoved( | |
| 475 mock_adapter_, device0_.get(), service0_.get()); | |
| 476 } | |
| 477 | |
| 478 IN_PROC_BROWSER_TEST_F(BluetoothLowEnergyApiTest, GetCharacteristic) { | |
| 479 ResultCatcher catcher; | |
| 480 catcher.RestrictToProfile(browser()->profile()); | |
| 481 | |
| 482 event_router()->GattServiceAdded( | |
| 483 mock_adapter_, device0_.get(), service0_.get()); | |
| 484 event_router()->GattCharacteristicAdded(mock_adapter_, chrc0_.get()); | |
| 485 | |
| 486 EXPECT_CALL(*mock_adapter_, GetDevice(_)) | |
| 487 .Times(4) | |
| 488 .WillOnce(Return(static_cast<BluetoothDevice*>(NULL))) | |
| 489 .WillRepeatedly(Return(device0_.get())); | |
| 490 | |
| 491 EXPECT_CALL(*device0_, GetGattService(kTestServiceId0)) | |
| 492 .Times(3) | |
| 493 .WillOnce(Return(static_cast<BluetoothGattService*>(NULL))) | |
| 494 .WillRepeatedly(Return(service0_.get())); | |
| 495 | |
| 496 EXPECT_CALL(*service0_, GetCharacteristic(kTestCharacteristicId0)) | |
| 497 .Times(2) | |
| 498 .WillOnce(Return(static_cast<BluetoothGattCharacteristic*>(NULL))) | |
| 499 .WillOnce(Return(chrc0_.get())); | |
| 500 | |
| 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()); | |
| 506 | |
| 507 listener.Reply("go"); | |
| 508 | |
| 509 EXPECT_TRUE(catcher.GetNextResult()) << catcher.message(); | |
| 510 | |
| 511 event_router()->GattCharacteristicRemoved(mock_adapter_, chrc0_.get()); | |
| 512 event_router()->GattServiceRemoved( | |
| 513 mock_adapter_, device0_.get(), service0_.get()); | |
| 514 } | |
| 515 | |
| 516 IN_PROC_BROWSER_TEST_F(BluetoothLowEnergyApiTest, CharacteristicProperties) { | |
| 517 ResultCatcher catcher; | |
| 518 catcher.RestrictToProfile(browser()->profile()); | |
| 519 | |
| 520 event_router()->GattServiceAdded( | |
| 521 mock_adapter_, device0_.get(), service0_.get()); | |
| 522 event_router()->GattCharacteristicAdded(mock_adapter_, chrc0_.get()); | |
| 523 | |
| 524 EXPECT_CALL(*mock_adapter_, GetDevice(_)) | |
| 525 .Times(12) | |
| 526 .WillRepeatedly(Return(device0_.get())); | |
| 527 EXPECT_CALL(*device0_, GetGattService(kTestServiceId0)) | |
| 528 .Times(12) | |
| 529 .WillRepeatedly(Return(service0_.get())); | |
| 530 EXPECT_CALL(*service0_, GetCharacteristic(kTestCharacteristicId0)) | |
| 531 .Times(12) | |
| 532 .WillRepeatedly(Return(chrc0_.get())); | |
| 533 EXPECT_CALL(*chrc0_, GetProperties()) | |
| 534 .Times(12) | |
| 535 .WillOnce(Return(BluetoothGattCharacteristic::kPropertyNone)) | |
| 536 .WillOnce(Return(BluetoothGattCharacteristic::kPropertyBroadcast)) | |
| 537 .WillOnce(Return(BluetoothGattCharacteristic::kPropertyRead)) | |
| 538 .WillOnce( | |
| 539 Return(BluetoothGattCharacteristic::kPropertyWriteWithoutResponse)) | |
| 540 .WillOnce(Return(BluetoothGattCharacteristic::kPropertyWrite)) | |
| 541 .WillOnce(Return(BluetoothGattCharacteristic::kPropertyNotify)) | |
| 542 .WillOnce(Return(BluetoothGattCharacteristic::kPropertyIndicate)) | |
| 543 .WillOnce(Return( | |
| 544 BluetoothGattCharacteristic::kPropertyAuthenticatedSignedWrites)) | |
| 545 .WillOnce( | |
| 546 Return(BluetoothGattCharacteristic::kPropertyExtendedProperties)) | |
| 547 .WillOnce(Return(BluetoothGattCharacteristic::kPropertyReliableWrite)) | |
| 548 .WillOnce( | |
| 549 Return(BluetoothGattCharacteristic::kPropertyWritableAuxiliaries)) | |
| 550 .WillOnce(Return( | |
| 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)); | |
| 561 | |
| 562 ExtensionTestMessageListener listener("ready", true); | |
| 563 ASSERT_TRUE(LoadExtension(test_data_dir_.AppendASCII( | |
| 564 "bluetooth_low_energy/characteristic_properties"))); | |
| 565 EXPECT_TRUE(listener.WaitUntilSatisfied()); | |
| 566 | |
| 567 listener.Reply("go"); | |
| 568 | |
| 569 EXPECT_TRUE(catcher.GetNextResult()) << catcher.message(); | |
| 570 | |
| 571 event_router()->GattCharacteristicRemoved(mock_adapter_, chrc0_.get()); | |
| 572 event_router()->GattServiceRemoved( | |
| 573 mock_adapter_, device0_.get(), service0_.get()); | |
| 574 } | |
| 575 | |
| 576 IN_PROC_BROWSER_TEST_F(BluetoothLowEnergyApiTest, GetRemovedCharacteristic) { | |
| 577 ResultCatcher catcher; | |
| 578 catcher.RestrictToProfile(browser()->profile()); | |
| 579 | |
| 580 EXPECT_CALL(*mock_adapter_, GetDevice(_)) | |
| 581 .Times(1) | |
| 582 .WillOnce(Return(device0_.get())); | |
| 583 EXPECT_CALL(*device0_, GetGattService(kTestServiceId0)) | |
| 584 .Times(1) | |
| 585 .WillOnce(Return(service0_.get())); | |
| 586 EXPECT_CALL(*service0_, GetCharacteristic(kTestCharacteristicId0)) | |
| 587 .Times(1) | |
| 588 .WillOnce(Return(chrc0_.get())); | |
| 589 | |
| 590 event_router()->GattServiceAdded( | |
| 591 mock_adapter_, device0_.get(), service0_.get()); | |
| 592 event_router()->GattCharacteristicAdded(mock_adapter_, chrc0_.get()); | |
| 593 | |
| 594 ASSERT_TRUE(LoadExtension(test_data_dir_.AppendASCII( | |
| 595 "bluetooth_low_energy/get_removed_characteristic"))); | |
| 596 | |
| 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()); | |
| 602 | |
| 603 EXPECT_CALL(*mock_adapter_, GetDevice(_)).Times(0); | |
| 604 EXPECT_CALL(*device0_, GetGattService(_)).Times(0); | |
| 605 EXPECT_CALL(*service0_, GetCharacteristic(_)).Times(0); | |
| 606 | |
| 607 event_router()->GattCharacteristicRemoved(mock_adapter_, chrc0_.get()); | |
| 608 | |
| 609 listener.Reply("go"); | |
| 610 listener.Reset(); | |
| 611 EXPECT_TRUE(listener.WaitUntilSatisfied()); | |
| 612 | |
| 613 listener.Reply("go"); | |
| 614 | |
| 615 EXPECT_TRUE(catcher.GetNextResult()) << catcher.message(); | |
| 616 event_router()->GattServiceRemoved( | |
| 617 mock_adapter_, device0_.get(), service0_.get()); | |
| 618 } | |
| 619 | |
| 620 IN_PROC_BROWSER_TEST_F(BluetoothLowEnergyApiTest, CharacteristicValueChanged) { | |
| 621 ResultCatcher catcher; | |
| 622 catcher.RestrictToProfile(browser()->profile()); | |
| 623 | |
| 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()); | |
| 631 | |
| 632 EXPECT_CALL(*mock_adapter_, GetDevice(_)) | |
| 633 .Times(2) | |
| 634 .WillRepeatedly(Return(device0_.get())); | |
| 635 EXPECT_CALL(*device0_, GetGattService(kTestServiceId0)) | |
| 636 .Times(1) | |
| 637 .WillOnce(Return(service0_.get())); | |
| 638 EXPECT_CALL(*device0_, GetGattService(kTestServiceId1)) | |
| 639 .Times(1) | |
| 640 .WillOnce(Return(service1_.get())); | |
| 641 EXPECT_CALL(*service0_, GetCharacteristic(kTestCharacteristicId0)) | |
| 642 .Times(1) | |
| 643 .WillOnce(Return(chrc0_.get())); | |
| 644 EXPECT_CALL(*service1_, GetCharacteristic(kTestCharacteristicId2)) | |
| 645 .Times(1) | |
| 646 .WillOnce(Return(chrc2_.get())); | |
| 647 | |
| 648 BluetoothGattNotifySession* session0 = | |
| 649 new testing::NiceMock<MockBluetoothGattNotifySession>( | |
| 650 kTestCharacteristicId0); | |
| 651 BluetoothGattNotifySession* session1 = | |
| 652 new testing::NiceMock<MockBluetoothGattNotifySession>( | |
| 653 kTestCharacteristicId2); | |
| 654 | |
| 655 EXPECT_CALL(*chrc0_, StartNotifySession(_, _)) | |
| 656 .Times(1) | |
| 657 .WillOnce( | |
| 658 InvokeCallbackWithScopedPtrArg<0, BluetoothGattNotifySession>( | |
| 659 session0)); | |
| 660 EXPECT_CALL(*chrc2_, StartNotifySession(_, _)) | |
| 661 .Times(1) | |
| 662 .WillOnce( | |
| 663 InvokeCallbackWithScopedPtrArg<0, BluetoothGattNotifySession>( | |
| 664 session1)); | |
| 665 | |
| 666 ExtensionTestMessageListener listener("ready", true); | |
| 667 ASSERT_TRUE(LoadExtension(test_data_dir_.AppendASCII( | |
| 668 "bluetooth_low_energy/characteristic_value_changed"))); | |
| 669 | |
| 670 EXPECT_TRUE(listener.WaitUntilSatisfied()); | |
| 671 | |
| 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); | |
| 677 | |
| 678 listener.Reply("go"); | |
| 679 | |
| 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()); | |
| 687 } | |
| 688 | |
| 689 IN_PROC_BROWSER_TEST_F(BluetoothLowEnergyApiTest, ReadCharacteristicValue) { | |
| 690 ResultCatcher catcher; | |
| 691 catcher.RestrictToProfile(browser()->profile()); | |
| 692 | |
| 693 event_router()->GattServiceAdded( | |
| 694 mock_adapter_, device0_.get(), service0_.get()); | |
| 695 event_router()->GattCharacteristicAdded(mock_adapter_, chrc0_.get()); | |
| 696 | |
| 697 EXPECT_CALL(*mock_adapter_, GetDevice(_)) | |
| 698 .Times(3) | |
| 699 .WillRepeatedly(Return(device0_.get())); | |
| 700 | |
| 701 EXPECT_CALL(*device0_, GetGattService(kTestServiceId0)) | |
| 702 .Times(3) | |
| 703 .WillRepeatedly(Return(service0_.get())); | |
| 704 | |
| 705 EXPECT_CALL(*service0_, GetCharacteristic(kTestCharacteristicId0)) | |
| 706 .Times(3) | |
| 707 .WillRepeatedly(Return(chrc0_.get())); | |
| 708 | |
| 709 std::vector<uint8> value; | |
| 710 EXPECT_CALL(*chrc0_, ReadRemoteCharacteristic(_, _)) | |
| 711 .Times(2) | |
| 712 .WillOnce(InvokeCallbackArgument<1>()) | |
| 713 .WillOnce(InvokeCallbackArgument<0>(value)); | |
| 714 | |
| 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()); | |
| 719 | |
| 720 listener.Reply("go"); | |
| 721 | |
| 722 EXPECT_TRUE(catcher.GetNextResult()) << catcher.message(); | |
| 723 | |
| 724 event_router()->GattCharacteristicRemoved(mock_adapter_, chrc0_.get()); | |
| 725 event_router()->GattServiceRemoved( | |
| 726 mock_adapter_, device0_.get(), service0_.get()); | |
| 727 } | |
| 728 | |
| 729 IN_PROC_BROWSER_TEST_F(BluetoothLowEnergyApiTest, WriteCharacteristicValue) { | |
| 730 ResultCatcher catcher; | |
| 731 catcher.RestrictToProfile(browser()->profile()); | |
| 732 | |
| 733 event_router()->GattServiceAdded( | |
| 734 mock_adapter_, device0_.get(), service0_.get()); | |
| 735 event_router()->GattCharacteristicAdded(mock_adapter_, chrc0_.get()); | |
| 736 | |
| 737 EXPECT_CALL(*mock_adapter_, GetDevice(_)) | |
| 738 .Times(3) | |
| 739 .WillRepeatedly(Return(device0_.get())); | |
| 740 | |
| 741 EXPECT_CALL(*device0_, GetGattService(kTestServiceId0)) | |
| 742 .Times(3) | |
| 743 .WillRepeatedly(Return(service0_.get())); | |
| 744 | |
| 745 EXPECT_CALL(*service0_, GetCharacteristic(kTestCharacteristicId0)) | |
| 746 .Times(3) | |
| 747 .WillRepeatedly(Return(chrc0_.get())); | |
| 748 | |
| 749 std::vector<uint8> write_value; | |
| 750 EXPECT_CALL(*chrc0_, WriteRemoteCharacteristic(_, _, _)) | |
| 751 .Times(2) | |
| 752 .WillOnce(InvokeCallbackArgument<2>()) | |
| 753 .WillOnce(DoAll(SaveArg<0>(&write_value), InvokeCallbackArgument<1>())); | |
| 754 | |
| 755 EXPECT_CALL(*chrc0_, GetValue()).Times(1).WillOnce(ReturnRef(write_value)); | |
| 756 | |
| 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()); | |
| 761 | |
| 762 listener.Reply("go"); | |
| 763 | |
| 764 EXPECT_TRUE(catcher.GetNextResult()) << catcher.message(); | |
| 765 | |
| 766 event_router()->GattCharacteristicRemoved(mock_adapter_, chrc0_.get()); | |
| 767 event_router()->GattServiceRemoved( | |
| 768 mock_adapter_, device0_.get(), service0_.get()); | |
| 769 } | |
| 770 | |
| 771 IN_PROC_BROWSER_TEST_F(BluetoothLowEnergyApiTest, GetDescriptors) { | |
| 772 ResultCatcher catcher; | |
| 773 catcher.RestrictToProfile(browser()->profile()); | |
| 774 | |
| 775 std::vector<BluetoothGattDescriptor*> descriptors; | |
| 776 descriptors.push_back(desc0_.get()); | |
| 777 descriptors.push_back(desc1_.get()); | |
| 778 | |
| 779 event_router()->GattServiceAdded( | |
| 780 mock_adapter_, device0_.get(), service0_.get()); | |
| 781 event_router()->GattCharacteristicAdded(mock_adapter_, chrc0_.get()); | |
| 782 | |
| 783 EXPECT_CALL(*mock_adapter_, GetDevice(_)) | |
| 784 .Times(3) | |
| 785 .WillRepeatedly(Return(device0_.get())); | |
| 786 EXPECT_CALL(*device0_, GetGattService(kTestServiceId0)) | |
| 787 .Times(3) | |
| 788 .WillRepeatedly(Return(service0_.get())); | |
| 789 EXPECT_CALL(*service0_, GetCharacteristic(kTestCharacteristicId0)) | |
| 790 .Times(3) | |
| 791 .WillOnce(Return(static_cast<BluetoothGattCharacteristic*>(NULL))) | |
| 792 .WillRepeatedly(Return(chrc0_.get())); | |
| 793 EXPECT_CALL(*chrc0_, GetDescriptors()) | |
| 794 .Times(2) | |
| 795 .WillOnce(Return(std::vector<BluetoothGattDescriptor*>())) | |
| 796 .WillOnce(Return(descriptors)); | |
| 797 | |
| 798 ExtensionTestMessageListener listener("ready", true); | |
| 799 ASSERT_TRUE(LoadExtension( | |
| 800 test_data_dir_.AppendASCII("bluetooth_low_energy/get_descriptors"))); | |
| 801 EXPECT_TRUE(listener.WaitUntilSatisfied()); | |
| 802 | |
| 803 listener.Reply("go"); | |
| 804 | |
| 805 EXPECT_TRUE(catcher.GetNextResult()) << catcher.message(); | |
| 806 | |
| 807 event_router()->GattCharacteristicRemoved(mock_adapter_, chrc0_.get()); | |
| 808 event_router()->GattServiceRemoved( | |
| 809 mock_adapter_, device0_.get(), service0_.get()); | |
| 810 } | |
| 811 | |
| 812 IN_PROC_BROWSER_TEST_F(BluetoothLowEnergyApiTest, GetDescriptor) { | |
| 813 ResultCatcher catcher; | |
| 814 catcher.RestrictToProfile(browser()->profile()); | |
| 815 | |
| 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()); | |
| 820 | |
| 821 EXPECT_CALL(*mock_adapter_, GetDevice(_)) | |
| 822 .Times(5) | |
| 823 .WillOnce(Return(static_cast<BluetoothDevice*>(NULL))) | |
| 824 .WillRepeatedly(Return(device0_.get())); | |
| 825 | |
| 826 EXPECT_CALL(*device0_, GetGattService(kTestServiceId0)) | |
| 827 .Times(4) | |
| 828 .WillOnce(Return(static_cast<BluetoothGattService*>(NULL))) | |
| 829 .WillRepeatedly(Return(service0_.get())); | |
| 830 | |
| 831 EXPECT_CALL(*service0_, GetCharacteristic(kTestCharacteristicId0)) | |
| 832 .Times(3) | |
| 833 .WillOnce(Return(static_cast<BluetoothGattCharacteristic*>(NULL))) | |
| 834 .WillRepeatedly(Return(chrc0_.get())); | |
| 835 | |
| 836 EXPECT_CALL(*chrc0_, GetDescriptor(kTestDescriptorId0)) | |
| 837 .Times(2) | |
| 838 .WillOnce(Return(static_cast<BluetoothGattDescriptor*>(NULL))) | |
| 839 .WillOnce(Return(desc0_.get())); | |
| 840 | |
| 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()); | |
| 846 | |
| 847 listener.Reply("go"); | |
| 848 | |
| 849 EXPECT_TRUE(catcher.GetNextResult()) << catcher.message(); | |
| 850 | |
| 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()); | |
| 855 } | |
| 856 | |
| 857 IN_PROC_BROWSER_TEST_F(BluetoothLowEnergyApiTest, GetRemovedDescriptor) { | |
| 858 ResultCatcher catcher; | |
| 859 catcher.RestrictToProfile(browser()->profile()); | |
| 860 | |
| 861 EXPECT_CALL(*mock_adapter_, GetDevice(_)) | |
| 862 .Times(1) | |
| 863 .WillOnce(Return(device0_.get())); | |
| 864 EXPECT_CALL(*device0_, GetGattService(kTestServiceId0)) | |
| 865 .Times(1) | |
| 866 .WillOnce(Return(service0_.get())); | |
| 867 EXPECT_CALL(*service0_, GetCharacteristic(kTestCharacteristicId0)) | |
| 868 .Times(1) | |
| 869 .WillOnce(Return(chrc0_.get())); | |
| 870 EXPECT_CALL(*chrc0_, GetDescriptor(kTestDescriptorId0)) | |
| 871 .Times(1) | |
| 872 .WillOnce(Return(desc0_.get())); | |
| 873 | |
| 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()); | |
| 878 | |
| 879 ASSERT_TRUE(LoadExtension(test_data_dir_.AppendASCII( | |
| 880 "bluetooth_low_energy/get_removed_descriptor"))); | |
| 881 | |
| 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()); | |
| 888 | |
| 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); | |
| 893 | |
| 894 event_router()->GattDescriptorRemoved(mock_adapter_, desc0_.get()); | |
| 895 | |
| 896 listener.Reply("go"); | |
| 897 listener.Reset(); | |
| 898 EXPECT_TRUE(listener.WaitUntilSatisfied()); | |
| 899 | |
| 900 listener.Reply("go"); | |
| 901 | |
| 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()); | |
| 906 } | |
| 907 | |
| 908 IN_PROC_BROWSER_TEST_F(BluetoothLowEnergyApiTest, DescriptorValueChanged) { | |
| 909 ResultCatcher catcher; | |
| 910 catcher.RestrictToProfile(browser()->profile()); | |
| 911 | |
| 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()); | |
| 917 | |
| 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"))); | |
| 922 | |
| 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); | |
| 929 | |
| 930 EXPECT_TRUE(listener.WaitUntilSatisfied()); | |
| 931 listener.Reply("go"); | |
| 932 | |
| 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()); | |
| 939 } | |
| 940 | |
| 941 IN_PROC_BROWSER_TEST_F(BluetoothLowEnergyApiTest, ReadDescriptorValue) { | |
| 942 ResultCatcher catcher; | |
| 943 catcher.RestrictToProfile(browser()->profile()); | |
| 944 | |
| 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()); | |
| 949 | |
| 950 EXPECT_CALL(*mock_adapter_, GetDevice(_)) | |
| 951 .Times(3) | |
| 952 .WillRepeatedly(Return(device0_.get())); | |
| 953 | |
| 954 EXPECT_CALL(*device0_, GetGattService(kTestServiceId0)) | |
| 955 .Times(3) | |
| 956 .WillRepeatedly(Return(service0_.get())); | |
| 957 | |
| 958 EXPECT_CALL(*service0_, GetCharacteristic(kTestCharacteristicId0)) | |
| 959 .Times(3) | |
| 960 .WillRepeatedly(Return(chrc0_.get())); | |
| 961 | |
| 962 EXPECT_CALL(*chrc0_, GetDescriptor(kTestDescriptorId0)) | |
| 963 .Times(3) | |
| 964 .WillRepeatedly(Return(desc0_.get())); | |
| 965 | |
| 966 std::vector<uint8> value; | |
| 967 EXPECT_CALL(*desc0_, ReadRemoteDescriptor(_, _)) | |
| 968 .Times(2) | |
| 969 .WillOnce(InvokeCallbackArgument<1>()) | |
| 970 .WillOnce(InvokeCallbackArgument<0>(value)); | |
| 971 | |
| 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()); | |
| 976 | |
| 977 listener.Reply("go"); | |
| 978 | |
| 979 EXPECT_TRUE(catcher.GetNextResult()) << catcher.message(); | |
| 980 | |
| 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()); | |
| 985 } | |
| 986 | |
| 987 IN_PROC_BROWSER_TEST_F(BluetoothLowEnergyApiTest, WriteDescriptorValue) { | |
| 988 ResultCatcher catcher; | |
| 989 catcher.RestrictToProfile(browser()->profile()); | |
| 990 | |
| 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()); | |
| 995 | |
| 996 EXPECT_CALL(*mock_adapter_, GetDevice(_)) | |
| 997 .Times(3) | |
| 998 .WillRepeatedly(Return(device0_.get())); | |
| 999 | |
| 1000 EXPECT_CALL(*device0_, GetGattService(kTestServiceId0)) | |
| 1001 .Times(3) | |
| 1002 .WillRepeatedly(Return(service0_.get())); | |
| 1003 | |
| 1004 EXPECT_CALL(*service0_, GetCharacteristic(kTestCharacteristicId0)) | |
| 1005 .Times(3) | |
| 1006 .WillRepeatedly(Return(chrc0_.get())); | |
| 1007 | |
| 1008 EXPECT_CALL(*chrc0_, GetDescriptor(kTestDescriptorId0)) | |
| 1009 .Times(3) | |
| 1010 .WillRepeatedly(Return(desc0_.get())); | |
| 1011 | |
| 1012 std::vector<uint8> write_value; | |
| 1013 EXPECT_CALL(*desc0_, WriteRemoteDescriptor(_, _, _)) | |
| 1014 .Times(2) | |
| 1015 .WillOnce(InvokeCallbackArgument<2>()) | |
| 1016 .WillOnce(DoAll(SaveArg<0>(&write_value), InvokeCallbackArgument<1>())); | |
| 1017 | |
| 1018 EXPECT_CALL(*desc0_, GetValue()).Times(1).WillOnce(ReturnRef(write_value)); | |
| 1019 | |
| 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()); | |
| 1024 | |
| 1025 listener.Reply("go"); | |
| 1026 | |
| 1027 EXPECT_TRUE(catcher.GetNextResult()) << catcher.message(); | |
| 1028 | |
| 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()); | |
| 1033 } | |
| 1034 | |
| 1035 IN_PROC_BROWSER_TEST_F(BluetoothLowEnergyApiTest, PermissionDenied) { | |
| 1036 ResultCatcher catcher; | |
| 1037 catcher.RestrictToProfile(browser()->profile()); | |
| 1038 | |
| 1039 ASSERT_TRUE(LoadExtension(test_data_dir_.AppendASCII( | |
| 1040 "bluetooth_low_energy/permission_denied"))); | |
| 1041 EXPECT_TRUE(catcher.GetNextResult()) << catcher.message(); | |
| 1042 } | |
| 1043 | |
| 1044 IN_PROC_BROWSER_TEST_F(BluetoothLowEnergyApiTest, UuidPermissionMethods) { | |
| 1045 ResultCatcher catcher; | |
| 1046 catcher.RestrictToProfile(browser()->profile()); | |
| 1047 | |
| 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()); | |
| 1052 | |
| 1053 std::vector<BluetoothGattService*> services; | |
| 1054 services.push_back(service0_.get()); | |
| 1055 | |
| 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())); | |
| 1065 | |
| 1066 ASSERT_TRUE(LoadExtension(test_data_dir_.AppendASCII( | |
| 1067 "bluetooth_low_energy/uuid_permission_methods"))); | |
| 1068 EXPECT_TRUE(catcher.GetNextResult()) << catcher.message(); | |
| 1069 | |
| 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()); | |
| 1074 } | |
| 1075 | |
| 1076 IN_PROC_BROWSER_TEST_F(BluetoothLowEnergyApiTest, UuidPermissionEvents) { | |
| 1077 ResultCatcher catcher; | |
| 1078 catcher.RestrictToProfile(browser()->profile()); | |
| 1079 | |
| 1080 ExtensionTestMessageListener listener("ready", true); | |
| 1081 ASSERT_TRUE(LoadExtension(test_data_dir_.AppendASCII( | |
| 1082 "bluetooth_low_energy/uuid_permission_events"))); | |
| 1083 | |
| 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()); | |
| 1089 | |
| 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()); | |
| 1096 | |
| 1097 EXPECT_TRUE(listener.WaitUntilSatisfied()); | |
| 1098 listener.Reply("go"); | |
| 1099 EXPECT_TRUE(catcher.GetNextResult()) << catcher.message(); | |
| 1100 | |
| 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()); | |
| 1105 } | |
| 1106 | |
| 1107 IN_PROC_BROWSER_TEST_F(BluetoothLowEnergyApiTest, GattConnection) { | |
| 1108 ResultCatcher catcher; | |
| 1109 catcher.RestrictToProfile(browser()->profile()); | |
| 1110 | |
| 1111 | |
| 1112 EXPECT_CALL(*mock_adapter_, GetDevice(_)) | |
| 1113 .WillRepeatedly(Return(static_cast<BluetoothDevice*>(NULL))); | |
| 1114 EXPECT_CALL(*mock_adapter_, GetDevice(kTestLeDeviceAddress0)) | |
| 1115 .WillRepeatedly(Return(device0_.get())); | |
| 1116 EXPECT_CALL(*mock_adapter_, GetDevice(kTestLeDeviceAddress1)) | |
| 1117 .WillRepeatedly(Return(device1_.get())); | |
| 1118 EXPECT_CALL(*device0_, CreateGattConnection(_, _)) | |
| 1119 .Times(3) | |
| 1120 .WillOnce(InvokeCallbackArgument<1>(BluetoothDevice::ERROR_FAILED)) | |
| 1121 .WillOnce(InvokeCallbackWithScopedPtrArg<0, BluetoothGattConnection>( | |
| 1122 CreateGattConnection(kTestLeDeviceAddress0, | |
| 1123 true /* expect_disconnect */))) | |
| 1124 .WillOnce(InvokeCallbackWithScopedPtrArg<0, BluetoothGattConnection>( | |
| 1125 CreateGattConnection(kTestLeDeviceAddress0, | |
| 1126 false /* expect_disconnect */))); | |
| 1127 EXPECT_CALL(*device1_, CreateGattConnection(_, _)) | |
| 1128 .Times(1) | |
| 1129 .WillOnce(InvokeCallbackWithScopedPtrArg<0, BluetoothGattConnection>( | |
| 1130 CreateGattConnection(kTestLeDeviceAddress1, | |
| 1131 true /* expect_disconnect */))); | |
| 1132 | |
| 1133 ASSERT_TRUE(LoadExtension( | |
| 1134 test_data_dir_.AppendASCII("bluetooth_low_energy/gatt_connection"))); | |
| 1135 EXPECT_TRUE(catcher.GetNextResult()) << catcher.message(); | |
| 1136 } | |
| 1137 | |
| 1138 IN_PROC_BROWSER_TEST_F(BluetoothLowEnergyApiTest, ReconnectAfterDisconnected) { | |
| 1139 ResultCatcher catcher; | |
| 1140 catcher.RestrictToProfile(browser()->profile()); | |
| 1141 | |
| 1142 | |
| 1143 EXPECT_CALL(*mock_adapter_, GetDevice(kTestLeDeviceAddress0)) | |
| 1144 .WillRepeatedly(Return(device0_.get())); | |
| 1145 | |
| 1146 MockBluetoothGattConnection* first_conn = | |
| 1147 static_cast<MockBluetoothGattConnection*>(CreateGattConnection( | |
| 1148 kTestLeDeviceAddress0, false /* expect_disconnect */)); | |
| 1149 EXPECT_CALL(*first_conn, IsConnected()) | |
| 1150 .Times(2) | |
| 1151 .WillOnce(Return(true)) | |
| 1152 .WillOnce(Return(false)); | |
| 1153 | |
| 1154 EXPECT_CALL(*device0_, CreateGattConnection(_, _)) | |
| 1155 .Times(2) | |
| 1156 .WillOnce(InvokeCallbackWithScopedPtrArg<0, BluetoothGattConnection>( | |
| 1157 first_conn)) | |
| 1158 .WillOnce(InvokeCallbackWithScopedPtrArg<0, BluetoothGattConnection>( | |
| 1159 CreateGattConnection(kTestLeDeviceAddress0, | |
| 1160 false /* expect_disconnect */))); | |
| 1161 | |
| 1162 ASSERT_TRUE(LoadExtension(test_data_dir_.AppendASCII( | |
| 1163 "bluetooth_low_energy/reconnect_after_disconnected"))); | |
| 1164 EXPECT_TRUE(catcher.GetNextResult()) << catcher.message(); | |
| 1165 | |
| 1166 } | |
| 1167 | |
| 1168 IN_PROC_BROWSER_TEST_F(BluetoothLowEnergyApiTest, ConnectInProgress) { | |
| 1169 ResultCatcher catcher; | |
| 1170 catcher.RestrictToProfile(browser()->profile()); | |
| 1171 | |
| 1172 | |
| 1173 EXPECT_CALL(*mock_adapter_, GetDevice(kTestLeDeviceAddress0)) | |
| 1174 .WillRepeatedly(Return(device0_.get())); | |
| 1175 | |
| 1176 BluetoothDevice::GattConnectionCallback connect_callback; | |
| 1177 base::Closure disconnect_callback; | |
| 1178 | |
| 1179 testing::NiceMock<MockBluetoothGattConnection>* conn = | |
| 1180 new testing::NiceMock<MockBluetoothGattConnection>( | |
| 1181 kTestLeDeviceAddress0); | |
| 1182 scoped_ptr<BluetoothGattConnection> conn_ptr(conn); | |
| 1183 EXPECT_CALL(*conn, Disconnect(_)) | |
| 1184 .Times(1) | |
| 1185 .WillOnce(SaveArg<0>(&disconnect_callback)); | |
| 1186 | |
| 1187 EXPECT_CALL(*device0_, CreateGattConnection(_, _)) | |
| 1188 .Times(1) | |
| 1189 .WillOnce(SaveArg<0>(&connect_callback)); | |
| 1190 | |
| 1191 ExtensionTestMessageListener listener("ready", true); | |
| 1192 ASSERT_TRUE(LoadExtension(test_data_dir_.AppendASCII( | |
| 1193 "bluetooth_low_energy/connect_in_progress"))); | |
| 1194 | |
| 1195 listener.WaitUntilSatisfied(); | |
| 1196 connect_callback.Run(conn_ptr.Pass()); | |
| 1197 | |
| 1198 listener.Reset(); | |
| 1199 listener.WaitUntilSatisfied(); | |
| 1200 disconnect_callback.Run(); | |
| 1201 | |
| 1202 EXPECT_TRUE(catcher.GetNextResult()) << catcher.message(); | |
| 1203 | |
| 1204 } | |
| 1205 | |
| 1206 IN_PROC_BROWSER_TEST_F(BluetoothLowEnergyApiTest, StartStopNotifications) { | |
| 1207 ResultCatcher catcher; | |
| 1208 catcher.RestrictToProfile(browser()->profile()); | |
| 1209 | |
| 1210 event_router()->GattServiceAdded( | |
| 1211 mock_adapter_, device0_.get(), service0_.get()); | |
| 1212 event_router()->GattServiceAdded( | |
| 1213 mock_adapter_, device0_.get(), service1_.get()); | |
| 1214 event_router()->GattCharacteristicAdded(mock_adapter_, chrc0_.get()); | |
| 1215 event_router()->GattCharacteristicAdded(mock_adapter_, chrc1_.get()); | |
| 1216 event_router()->GattCharacteristicAdded(mock_adapter_, chrc2_.get()); | |
| 1217 | |
| 1218 EXPECT_CALL(*mock_adapter_, GetDevice(_)) | |
| 1219 .WillRepeatedly(Return(device0_.get())); | |
| 1220 EXPECT_CALL(*device0_, GetGattService(kTestServiceId0)) | |
| 1221 .WillRepeatedly(Return(service0_.get())); | |
| 1222 EXPECT_CALL(*device0_, GetGattService(kTestServiceId1)) | |
| 1223 .WillRepeatedly(Return(service1_.get())); | |
| 1224 EXPECT_CALL(*service1_, GetCharacteristic(kTestCharacteristicId2)) | |
| 1225 .Times(1) | |
| 1226 .WillOnce(Return(chrc2_.get())); | |
| 1227 EXPECT_CALL(*service0_, GetCharacteristic(kTestCharacteristicId0)) | |
| 1228 .Times(2) | |
| 1229 .WillRepeatedly(Return(chrc0_.get())); | |
| 1230 EXPECT_CALL(*service0_, GetCharacteristic(kTestCharacteristicId1)) | |
| 1231 .Times(1) | |
| 1232 .WillOnce(Return(chrc1_.get())); | |
| 1233 | |
| 1234 BluetoothGattNotifySession* session0 = | |
| 1235 new testing::NiceMock<MockBluetoothGattNotifySession>( | |
| 1236 kTestCharacteristicId0); | |
| 1237 MockBluetoothGattNotifySession* session1 = | |
| 1238 new testing::NiceMock<MockBluetoothGattNotifySession>( | |
| 1239 kTestCharacteristicId1); | |
| 1240 | |
| 1241 EXPECT_CALL(*session1, Stop(_)) | |
| 1242 .Times(1) | |
| 1243 .WillOnce(InvokeCallbackArgument<0>()); | |
| 1244 | |
| 1245 EXPECT_CALL(*chrc0_, StartNotifySession(_, _)) | |
| 1246 .Times(2) | |
| 1247 .WillOnce(InvokeCallbackArgument<1>()) | |
| 1248 .WillOnce( | |
| 1249 InvokeCallbackWithScopedPtrArg<0, BluetoothGattNotifySession>( | |
| 1250 session0)); | |
| 1251 EXPECT_CALL(*chrc1_, StartNotifySession(_, _)) | |
| 1252 .Times(1) | |
| 1253 .WillOnce( | |
| 1254 InvokeCallbackWithScopedPtrArg<0, BluetoothGattNotifySession>( | |
| 1255 session1)); | |
| 1256 | |
| 1257 ExtensionTestMessageListener listener("ready", true); | |
| 1258 ASSERT_TRUE(LoadExtension(test_data_dir_.AppendASCII( | |
| 1259 "bluetooth_low_energy/start_stop_notifications"))); | |
| 1260 | |
| 1261 EXPECT_TRUE(listener.WaitUntilSatisfied()); | |
| 1262 | |
| 1263 std::vector<uint8> value; | |
| 1264 event_router()->GattCharacteristicValueChanged( | |
| 1265 mock_adapter_, chrc0_.get(), value); | |
| 1266 event_router()->GattCharacteristicValueChanged( | |
| 1267 mock_adapter_, chrc1_.get(), value); | |
| 1268 event_router()->GattCharacteristicValueChanged( | |
| 1269 mock_adapter_, chrc2_.get(), value); | |
| 1270 | |
| 1271 listener.Reply("go"); | |
| 1272 | |
| 1273 EXPECT_TRUE(catcher.GetNextResult()) << catcher.message(); | |
| 1274 event_router()->GattCharacteristicRemoved(mock_adapter_, chrc2_.get()); | |
| 1275 event_router()->GattCharacteristicRemoved(mock_adapter_, chrc1_.get()); | |
| 1276 event_router()->GattCharacteristicRemoved(mock_adapter_, chrc0_.get()); | |
| 1277 event_router()->GattServiceRemoved( | |
| 1278 mock_adapter_, device0_.get(), service1_.get()); | |
| 1279 event_router()->GattServiceRemoved( | |
| 1280 mock_adapter_, device0_.get(), service0_.get()); | |
| 1281 } | |
| 1282 | |
| 1283 } // namespace | |
| OLD | NEW |