Chromium Code Reviews| OLD | NEW |
|---|---|
| (Empty) | |
| 1 // Copyright 2015 The Chromium Authors. All rights reserved. | |
| 2 // Use of this source code is governed by a BSD-style license that can be | |
| 3 // found in the LICENSE file. | |
| 4 | |
| 5 #include "components/proximity_auth/ble/bluetooth_low_energy_connection.h" | |
| 6 | |
| 7 #include "base/bind.h" | |
| 8 #include "base/memory/ref_counted.h" | |
| 9 #include "base/memory/scoped_ptr.h" | |
| 10 #include "components/proximity_auth/ble/bluetooth_low_energy_characteristics_fin der.h" | |
| 11 #include "components/proximity_auth/connection_finder.h" | |
| 12 #include "components/proximity_auth/remote_device.h" | |
| 13 #include "components/proximity_auth/wire_message.h" | |
| 14 #include "device/bluetooth/bluetooth_adapter_factory.h" | |
| 15 #include "device/bluetooth/bluetooth_gatt_characteristic.h" | |
| 16 #include "device/bluetooth/bluetooth_uuid.h" | |
| 17 #include "device/bluetooth/test/mock_bluetooth_adapter.h" | |
| 18 #include "device/bluetooth/test/mock_bluetooth_device.h" | |
| 19 #include "device/bluetooth/test/mock_bluetooth_discovery_session.h" | |
| 20 #include "device/bluetooth/test/mock_bluetooth_gatt_characteristic.h" | |
| 21 #include "device/bluetooth/test/mock_bluetooth_gatt_connection.h" | |
| 22 #include "device/bluetooth/test/mock_bluetooth_gatt_notify_session.h" | |
| 23 #include "testing/gmock/include/gmock/gmock.h" | |
| 24 #include "testing/gtest/include/gtest/gtest.h" | |
| 25 | |
| 26 using testing::_; | |
| 27 using testing::AtLeast; | |
| 28 using testing::NiceMock; | |
| 29 using testing::Return; | |
| 30 using testing::StrictMock; | |
| 31 using testing::SaveArg; | |
| 32 | |
| 33 namespace proximity_auth { | |
| 34 namespace { | |
| 35 | |
| 36 const char kDeviceName[] = "Device name"; | |
| 37 const char kBluetoothAddress[] = "11:22:33:44:55:66"; | |
| 38 | |
| 39 const char kServiceUUID[] = "DEADBEEF-CAFE-FEED-FOOD-D15EA5EBEEEF"; | |
| 40 const char kToPeripheralCharUUID[] = "FBAE09F2-0482-11E5-8418-1697F925EC7B"; | |
| 41 const char kFromPeripheralCharUUID[] = "5539ED10-0483-11E5-8418-1697F925EC7B"; | |
| 42 | |
| 43 const char kServiceID[] = "service id"; | |
| 44 const char kToPeripheralCharID[] = "to peripheral char id"; | |
| 45 const char kFromPeripheralCharID[] = "from peripheral char id"; | |
| 46 | |
| 47 const device::BluetoothGattCharacteristic::Properties | |
| 48 kCharacteristicProperties = | |
| 49 device::BluetoothGattCharacteristic::PROPERTY_BROADCAST | | |
| 50 device::BluetoothGattCharacteristic::PROPERTY_READ | | |
| 51 device::BluetoothGattCharacteristic::PROPERTY_WRITE_WITHOUT_RESPONSE | | |
| 52 device::BluetoothGattCharacteristic::PROPERTY_INDICATE; | |
| 53 | |
| 54 const int kMaxNumberOfTries = 3; | |
| 55 | |
| 56 class MockBluetoothLowEnergyCharacteristicsFinder | |
| 57 : public BluetoothLowEnergyCharacteristicsFinder { | |
| 58 public: | |
| 59 MockBluetoothLowEnergyCharacteristicsFinder() {} | |
| 60 ~MockBluetoothLowEnergyCharacteristicsFinder() override {} | |
| 61 }; | |
| 62 | |
| 63 class MockBluetoothLowEnergyConnection : public BluetoothLowEnergyConnection { | |
| 64 public: | |
| 65 using BluetoothLowEnergyConnection::BluetoothLowEnergyConnection; | |
| 66 ~MockBluetoothLowEnergyConnection() override {} | |
| 67 | |
| 68 MOCK_METHOD2( | |
| 69 CreateCharacteristicsFinder, | |
| 70 BluetoothLowEnergyCharacteristicsFinder*( | |
| 71 const BluetoothLowEnergyCharacteristicsFinder::SuccessCallback& | |
| 72 success, | |
| 73 const BluetoothLowEnergyCharacteristicsFinder::ErrorCallback& error)); | |
| 74 | |
| 75 MOCK_METHOD2(OnDidSendMessage, | |
| 76 void(const WireMessage& message, bool success)); | |
| 77 | |
|
msarda
2015/06/05 09:40:19
// Exposing inherited protected methods for testin
sacomoto
2015/06/05 11:04:04
Done.
| |
| 78 using BluetoothLowEnergyConnection::GattCharacteristicValueChanged; | |
| 79 | |
|
msarda
2015/06/05 09:40:19
// Exposing inherited protected fields for testing
sacomoto
2015/06/05 11:04:04
Done.
| |
| 80 using BluetoothLowEnergyConnection::status; | |
| 81 using BluetoothLowEnergyConnection::SubStatus; | |
| 82 using BluetoothLowEnergyConnection::sub_status; | |
| 83 }; | |
| 84 | |
| 85 } // namespace | |
| 86 | |
| 87 class ProximityAuthBluetoothLowEnergyConnectionTest : public testing::Test { | |
| 88 public: | |
| 89 ProximityAuthBluetoothLowEnergyConnectionTest() | |
|
msarda
2015/06/05 09:40:19
This may be a personal preference, but I prefer ha
sacomoto
2015/06/05 11:04:04
Done.
| |
| 90 : adapter_(new NiceMock<device::MockBluetoothAdapter>), | |
| 91 remote_device_({kDeviceName, kBluetoothAddress}), | |
| 92 service_uuid_(device::BluetoothUUID(kServiceUUID)), | |
| 93 to_peripheral_char_uuid_(device::BluetoothUUID(kToPeripheralCharUUID)), | |
| 94 from_peripheral_char_uuid_( | |
| 95 device::BluetoothUUID(kFromPeripheralCharUUID)), | |
| 96 gatt_connection_(new NiceMock<device::MockBluetoothGattConnection>( | |
| 97 kBluetoothAddress)), | |
| 98 gatt_connection_alias_(gatt_connection_.get()), | |
| 99 device_(new NiceMock<device::MockBluetoothDevice>(adapter_.get(), | |
| 100 0, | |
| 101 kDeviceName, | |
| 102 kBluetoothAddress, | |
| 103 false, | |
| 104 false)), | |
| 105 service_(new NiceMock<device::MockBluetoothGattService>(device_.get(), | |
| 106 kServiceID, | |
| 107 service_uuid_, | |
| 108 true, | |
| 109 false)), | |
| 110 to_peripheral_char_( | |
| 111 new NiceMock<device::MockBluetoothGattCharacteristic>( | |
| 112 service_.get(), | |
| 113 kToPeripheralCharID, | |
| 114 to_peripheral_char_uuid_, | |
| 115 false, | |
| 116 kCharacteristicProperties, | |
| 117 device::BluetoothGattCharacteristic::PERMISSION_NONE)), | |
| 118 from_peripheral_char_( | |
| 119 new NiceMock<device::MockBluetoothGattCharacteristic>( | |
| 120 service_.get(), | |
| 121 kFromPeripheralCharID, | |
| 122 from_peripheral_char_uuid_, | |
| 123 false, | |
| 124 kCharacteristicProperties, | |
| 125 device::BluetoothGattCharacteristic::PERMISSION_NONE)), | |
| 126 notify_session_alias_(NULL) { | |
| 127 device::BluetoothAdapterFactory::SetAdapterForTesting(adapter_); | |
| 128 | |
| 129 ON_CALL(*adapter_, GetDevice(kBluetoothAddress)) | |
| 130 .WillByDefault(Return(device_.get())); | |
| 131 ON_CALL(*device_, GetGattService(kServiceID)) | |
| 132 .WillByDefault(Return(service_.get())); | |
| 133 ON_CALL(*service_, GetCharacteristic(kFromPeripheralCharID)) | |
| 134 .WillByDefault(Return(from_peripheral_char_.get())); | |
| 135 ON_CALL(*service_, GetCharacteristic(kToPeripheralCharID)) | |
| 136 .WillByDefault(Return(to_peripheral_char_.get())); | |
| 137 } | |
| 138 | |
| 139 // Creates a BluetoothLowEnergyConnection and verifies it's in DISCONNECTED | |
| 140 // state. | |
| 141 scoped_ptr<MockBluetoothLowEnergyConnection> CreateConnection() { | |
| 142 EXPECT_CALL(*adapter_, AddObserver(_)); | |
| 143 EXPECT_CALL(*adapter_, RemoveObserver(_)); | |
| 144 | |
| 145 scoped_ptr<MockBluetoothLowEnergyConnection> connection( | |
| 146 new MockBluetoothLowEnergyConnection( | |
| 147 remote_device_, adapter_, service_uuid_, to_peripheral_char_uuid_, | |
| 148 from_peripheral_char_uuid_, gatt_connection_.Pass(), | |
| 149 kMaxNumberOfTries)); | |
| 150 | |
| 151 EXPECT_EQ(connection->sub_status(), | |
| 152 MockBluetoothLowEnergyConnection::SubStatus::DISCONNECTED); | |
| 153 EXPECT_EQ(connection->status(), Connection::DISCONNECTED); | |
| 154 | |
| 155 return connection.Pass(); | |
| 156 } | |
| 157 | |
| 158 // Transitions |connection| from DISCONNECTED to WAITING_CHARACTERISTICS | |
| 159 // state, using an existing GATT connection. | |
| 160 void ConnectWithExistingGattConnection( | |
| 161 MockBluetoothLowEnergyConnection* connection) { | |
| 162 EXPECT_CALL(*gatt_connection_alias_, IsConnected()).WillOnce(Return(true)); | |
| 163 EXPECT_CALL(*connection, CreateCharacteristicsFinder(_, _)) | |
| 164 .WillOnce( | |
| 165 DoAll(SaveArg<0>(&characteristics_finder_success_callback_), | |
| 166 SaveArg<1>(&characteristics_finder_error_callback_), | |
| 167 Return(new MockBluetoothLowEnergyCharacteristicsFinder))); | |
| 168 | |
| 169 connection->Connect(); | |
| 170 | |
| 171 EXPECT_EQ( | |
| 172 connection->sub_status(), | |
| 173 MockBluetoothLowEnergyConnection::SubStatus::WAITING_CHARACTERISTICS); | |
| 174 EXPECT_EQ(connection->status(), Connection::IN_PROGRESS); | |
| 175 } | |
| 176 | |
| 177 // Transitions |connection| from DISCONNECTED to WAITING_CHARACTERISTICS | |
| 178 // state, without an existing GATT connection. | |
| 179 void ConnectWithoutExistingGattConnection( | |
| 180 MockBluetoothLowEnergyConnection* connection) { | |
| 181 // Preparing |connection| for a CreateGattConnection call. | |
| 182 EXPECT_CALL(*gatt_connection_alias_, IsConnected()).WillOnce(Return(false)); | |
| 183 EXPECT_CALL(*device_, CreateGattConnection(_, _)) | |
| 184 .WillOnce(DoAll(SaveArg<0>(&create_gatt_connection_success_callback_), | |
| 185 SaveArg<1>(&create_gatt_connection_error_callback_))); | |
| 186 | |
| 187 connection->Connect(); | |
| 188 | |
| 189 EXPECT_EQ( | |
| 190 connection->sub_status(), | |
| 191 MockBluetoothLowEnergyConnection::SubStatus::WAITING_GATT_CONNECTION); | |
| 192 EXPECT_EQ(connection->status(), Connection::IN_PROGRESS); | |
| 193 | |
| 194 // Preparing |connection| to run |create_gatt_connection_success_callback_|. | |
| 195 EXPECT_FALSE(create_gatt_connection_error_callback_.is_null()); | |
| 196 ASSERT_FALSE(create_gatt_connection_success_callback_.is_null()); | |
| 197 EXPECT_CALL(*connection, CreateCharacteristicsFinder(_, _)) | |
| 198 .WillOnce(DoAll( | |
| 199 SaveArg<0>(&characteristics_finder_success_callback_), | |
| 200 SaveArg<1>(&characteristics_finder_error_callback_), | |
| 201 Return(new NiceMock<MockBluetoothLowEnergyCharacteristicsFinder>))); | |
| 202 | |
| 203 create_gatt_connection_success_callback_.Run(make_scoped_ptr( | |
| 204 new NiceMock<device::MockBluetoothGattConnection>(kBluetoothAddress))); | |
| 205 | |
| 206 EXPECT_EQ( | |
| 207 connection->sub_status(), | |
| 208 MockBluetoothLowEnergyConnection::SubStatus::WAITING_CHARACTERISTICS); | |
| 209 EXPECT_EQ(connection->status(), Connection::IN_PROGRESS); | |
| 210 } | |
| 211 | |
| 212 // Transitions |connection| from WAITING_CHARACTERISTICS to | |
| 213 // WAITING_NOTIFY_SESSION state. | |
| 214 void CharacteristicsFound(MockBluetoothLowEnergyConnection* connection) { | |
| 215 EXPECT_CALL(*from_peripheral_char_, StartNotifySession(_, _)) | |
| 216 .WillOnce(DoAll(SaveArg<0>(¬ify_session_success_callback_), | |
| 217 SaveArg<1>(¬ify_session_error_callback_))); | |
| 218 EXPECT_FALSE(characteristics_finder_error_callback_.is_null()); | |
| 219 ASSERT_FALSE(characteristics_finder_success_callback_.is_null()); | |
| 220 | |
| 221 characteristics_finder_success_callback_.Run( | |
| 222 {service_uuid_, kServiceID}, | |
| 223 {to_peripheral_char_uuid_, kToPeripheralCharID}, | |
| 224 {from_peripheral_char_uuid_, kFromPeripheralCharID}); | |
| 225 | |
| 226 EXPECT_EQ( | |
| 227 connection->sub_status(), | |
| 228 MockBluetoothLowEnergyConnection::SubStatus::WAITING_NOTIFY_SESSION); | |
| 229 EXPECT_EQ(connection->status(), Connection::IN_PROGRESS); | |
| 230 } | |
| 231 | |
| 232 // Transitions |connection| from WAITING_NOTIFY_SESSION to | |
| 233 // WAITING_RESPONSE_SIGNAL state. | |
| 234 void NotifySessionStarted(MockBluetoothLowEnergyConnection* connection) { | |
| 235 EXPECT_CALL(*to_peripheral_char_, WriteRemoteCharacteristic(_, _, _)) | |
| 236 .WillOnce( | |
| 237 DoAll(SaveArg<0>(&last_value_written_on_to_peripheral_char_), | |
| 238 SaveArg<1>(&write_remote_characteristic_success_callback_), | |
| 239 SaveArg<2>(&write_remote_characteristic_error_callback_))); | |
| 240 EXPECT_FALSE(notify_session_error_callback_.is_null()); | |
| 241 ASSERT_FALSE(notify_session_success_callback_.is_null()); | |
| 242 | |
| 243 // Store an alias for the notify session passed |connection|. | |
| 244 scoped_ptr<device::MockBluetoothGattNotifySession> notify_session( | |
| 245 new NiceMock<device::MockBluetoothGattNotifySession>( | |
| 246 kToPeripheralCharID)); | |
| 247 notify_session_alias_ = notify_session.get(); | |
| 248 notify_session_success_callback_.Run(notify_session.Pass()); | |
| 249 | |
| 250 EXPECT_EQ( | |
| 251 connection->sub_status(), | |
| 252 MockBluetoothLowEnergyConnection::SubStatus::WAITING_RESPONSE_SIGNAL); | |
| 253 EXPECT_EQ(connection->status(), Connection::IN_PROGRESS); | |
| 254 } | |
| 255 | |
| 256 // Transitions |connection| from WAITING_RESPONSE_SIGNAL to CONNECTED state. | |
| 257 void ResponseSignalReceived(MockBluetoothLowEnergyConnection* connection) { | |
| 258 // Written value contains only the | |
| 259 // BluetoothLowEneryConnection::ControlSignal::kSendSignal. | |
| 260 const std::vector<uint8> kSendSignal = {0, 0, 0, 0}; | |
| 261 EXPECT_EQ(last_value_written_on_to_peripheral_char_, kSendSignal); | |
| 262 | |
| 263 EXPECT_CALL(*connection, OnDidSendMessage(_, _)).Times(0); | |
| 264 EXPECT_FALSE(write_remote_characteristic_error_callback_.is_null()); | |
| 265 ASSERT_FALSE(write_remote_characteristic_success_callback_.is_null()); | |
| 266 write_remote_characteristic_success_callback_.Run(); | |
| 267 | |
| 268 // Received the | |
| 269 // BluetoothLowEneryConnection::ControlSignal::kInvitationResponseSignal. | |
| 270 const std::vector<uint8> kInvitationResponseSignal = {1, 0, 0, 0}; | |
| 271 connection->GattCharacteristicValueChanged( | |
| 272 adapter_.get(), from_peripheral_char_.get(), kInvitationResponseSignal); | |
| 273 | |
| 274 EXPECT_EQ(connection->sub_status(), | |
| 275 MockBluetoothLowEnergyConnection::SubStatus::CONNECTED); | |
| 276 EXPECT_EQ(connection->status(), Connection::CONNECTED); | |
| 277 } | |
| 278 | |
| 279 // Transitions |connection| to a DISCONNECTED state regardless of its initial | |
| 280 // state. | |
| 281 void Disconnect(MockBluetoothLowEnergyConnection* connection) { | |
| 282 // A notify session was previously set. | |
| 283 if (notify_session_alias_) | |
| 284 EXPECT_CALL(*notify_session_alias_, Stop(_)); | |
| 285 | |
| 286 connection->Disconnect(); | |
| 287 | |
| 288 EXPECT_EQ(connection->sub_status(), | |
| 289 MockBluetoothLowEnergyConnection::SubStatus::DISCONNECTED); | |
| 290 EXPECT_EQ(connection->status(), Connection::DISCONNECTED); | |
| 291 } | |
| 292 | |
| 293 protected: | |
| 294 scoped_refptr<device::MockBluetoothAdapter> adapter_; | |
| 295 RemoteDevice remote_device_; | |
| 296 device::BluetoothUUID service_uuid_; | |
| 297 device::BluetoothUUID to_peripheral_char_uuid_; | |
| 298 device::BluetoothUUID from_peripheral_char_uuid_; | |
| 299 scoped_ptr<device::MockBluetoothGattConnection> gatt_connection_; | |
| 300 device::MockBluetoothGattConnection* gatt_connection_alias_; | |
|
msarda
2015/06/05 09:40:19
I think this is useless (only used twice). Please
sacomoto
2015/06/05 11:04:04
We cannot remove it. We pass the ownership of |gat
| |
| 301 scoped_ptr<device::MockBluetoothDevice> device_; | |
| 302 scoped_ptr<device::MockBluetoothGattService> service_; | |
| 303 scoped_ptr<device::MockBluetoothGattCharacteristic> to_peripheral_char_; | |
| 304 scoped_ptr<device::MockBluetoothGattCharacteristic> from_peripheral_char_; | |
| 305 std::vector<uint8> last_value_written_on_to_peripheral_char_; | |
| 306 device::MockBluetoothGattNotifySession* notify_session_alias_; | |
| 307 | |
| 308 // Callbacks | |
| 309 device::BluetoothDevice::GattConnectionCallback | |
| 310 create_gatt_connection_success_callback_; | |
| 311 device::BluetoothDevice::ConnectErrorCallback | |
| 312 create_gatt_connection_error_callback_; | |
| 313 | |
| 314 BluetoothLowEnergyCharacteristicsFinder::SuccessCallback | |
| 315 characteristics_finder_success_callback_; | |
| 316 BluetoothLowEnergyCharacteristicsFinder::ErrorCallback | |
| 317 characteristics_finder_error_callback_; | |
| 318 | |
| 319 device::BluetoothGattCharacteristic::NotifySessionCallback | |
| 320 notify_session_success_callback_; | |
| 321 device::BluetoothGattCharacteristic::ErrorCallback | |
| 322 notify_session_error_callback_; | |
| 323 | |
| 324 base::Closure write_remote_characteristic_success_callback_; | |
| 325 device::BluetoothGattCharacteristic::ErrorCallback | |
| 326 write_remote_characteristic_error_callback_; | |
| 327 }; | |
| 328 | |
| 329 TEST_F(ProximityAuthBluetoothLowEnergyConnectionTest, | |
| 330 CreateAndDestroyWithouthConnectCallDoesntCrash) { | |
| 331 BluetoothLowEnergyConnection connection( | |
| 332 remote_device_, adapter_, service_uuid_, to_peripheral_char_uuid_, | |
| 333 from_peripheral_char_uuid_, gatt_connection_.Pass(), kMaxNumberOfTries); | |
| 334 } | |
| 335 | |
| 336 TEST_F(ProximityAuthBluetoothLowEnergyConnectionTest, | |
| 337 Disconect_WithoutConnectDoesntCrash) { | |
| 338 scoped_ptr<MockBluetoothLowEnergyConnection> connection(CreateConnection()); | |
| 339 Disconnect(connection.get()); | |
| 340 } | |
| 341 | |
| 342 TEST_F(ProximityAuthBluetoothLowEnergyConnectionTest, | |
| 343 Connect_Success_WithGattConnection) { | |
| 344 scoped_ptr<MockBluetoothLowEnergyConnection> connection(CreateConnection()); | |
| 345 ConnectWithExistingGattConnection(connection.get()); | |
| 346 CharacteristicsFound(connection.get()); | |
| 347 NotifySessionStarted(connection.get()); | |
| 348 ResponseSignalReceived(connection.get()); | |
| 349 } | |
| 350 | |
| 351 TEST_F(ProximityAuthBluetoothLowEnergyConnectionTest, | |
| 352 Connect_Success_WithoutGattConnection) { | |
| 353 scoped_ptr<MockBluetoothLowEnergyConnection> connection(CreateConnection()); | |
| 354 ConnectWithoutExistingGattConnection(connection.get()); | |
| 355 CharacteristicsFound(connection.get()); | |
| 356 NotifySessionStarted(connection.get()); | |
| 357 ResponseSignalReceived(connection.get()); | |
| 358 } | |
| 359 | |
| 360 TEST_F(ProximityAuthBluetoothLowEnergyConnectionTest, | |
| 361 Connect_Success_Disconnect) { | |
| 362 scoped_ptr<MockBluetoothLowEnergyConnection> connection(CreateConnection()); | |
| 363 ConnectWithExistingGattConnection(connection.get()); | |
| 364 CharacteristicsFound(connection.get()); | |
| 365 NotifySessionStarted(connection.get()); | |
| 366 ResponseSignalReceived(connection.get()); | |
| 367 Disconnect(connection.get()); | |
| 368 } | |
| 369 | |
| 370 TEST_F( | |
| 371 ProximityAuthBluetoothLowEnergyConnectionTest, | |
| 372 Connect_Incomplete_Disconnect_FromWaitingCharacteristicsStateWithoutExisting GattConnection) { | |
| 373 scoped_ptr<MockBluetoothLowEnergyConnection> connection(CreateConnection()); | |
| 374 ConnectWithoutExistingGattConnection(connection.get()); | |
| 375 Disconnect(connection.get()); | |
| 376 } | |
| 377 | |
| 378 TEST_F(ProximityAuthBluetoothLowEnergyConnectionTest, | |
| 379 Connect_Incomplete_Disconnect_FromWaitingCharacteristicsState) { | |
| 380 scoped_ptr<MockBluetoothLowEnergyConnection> connection(CreateConnection()); | |
| 381 ConnectWithExistingGattConnection(connection.get()); | |
| 382 Disconnect(connection.get()); | |
| 383 } | |
| 384 | |
| 385 TEST_F(ProximityAuthBluetoothLowEnergyConnectionTest, | |
| 386 Connect_Incomplete_Disconnect_FromWaitingNotifySessionState) { | |
| 387 scoped_ptr<MockBluetoothLowEnergyConnection> connection(CreateConnection()); | |
| 388 ConnectWithExistingGattConnection(connection.get()); | |
| 389 CharacteristicsFound(connection.get()); | |
| 390 Disconnect(connection.get()); | |
| 391 } | |
| 392 | |
| 393 TEST_F(ProximityAuthBluetoothLowEnergyConnectionTest, | |
| 394 Connect_Incomplete_Disconnect_FromWaitingResponseSignalState) { | |
| 395 scoped_ptr<MockBluetoothLowEnergyConnection> connection(CreateConnection()); | |
| 396 ConnectWithExistingGattConnection(connection.get()); | |
| 397 CharacteristicsFound(connection.get()); | |
| 398 NotifySessionStarted(connection.get()); | |
| 399 Disconnect(connection.get()); | |
| 400 } | |
| 401 | |
| 402 TEST_F(ProximityAuthBluetoothLowEnergyConnectionTest, | |
| 403 Connect_Fails_CharacteristicsNotFound) { | |
| 404 scoped_ptr<MockBluetoothLowEnergyConnection> connection(CreateConnection()); | |
| 405 ConnectWithExistingGattConnection(connection.get()); | |
| 406 | |
| 407 EXPECT_CALL(*from_peripheral_char_, StartNotifySession(_, _)).Times(0); | |
| 408 EXPECT_FALSE(characteristics_finder_success_callback_.is_null()); | |
| 409 ASSERT_FALSE(characteristics_finder_error_callback_.is_null()); | |
| 410 | |
| 411 characteristics_finder_error_callback_.Run( | |
| 412 {to_peripheral_char_uuid_, kToPeripheralCharID}, | |
| 413 {from_peripheral_char_uuid_, kFromPeripheralCharID}); | |
| 414 | |
| 415 EXPECT_EQ(connection->sub_status(), | |
| 416 MockBluetoothLowEnergyConnection::SubStatus::DISCONNECTED); | |
| 417 EXPECT_EQ(connection->status(), Connection::DISCONNECTED); | |
| 418 } | |
| 419 | |
| 420 TEST_F(ProximityAuthBluetoothLowEnergyConnectionTest, | |
| 421 Connect_Fails_NotifySessionError) { | |
| 422 scoped_ptr<MockBluetoothLowEnergyConnection> connection(CreateConnection()); | |
| 423 ConnectWithExistingGattConnection(connection.get()); | |
| 424 CharacteristicsFound(connection.get()); | |
| 425 | |
| 426 EXPECT_CALL(*to_peripheral_char_, WriteRemoteCharacteristic(_, _, _)) | |
| 427 .Times(0); | |
| 428 EXPECT_FALSE(notify_session_success_callback_.is_null()); | |
| 429 ASSERT_FALSE(notify_session_error_callback_.is_null()); | |
| 430 | |
| 431 notify_session_error_callback_.Run( | |
| 432 device::BluetoothGattService::GATT_ERROR_UNKNOWN); | |
| 433 | |
| 434 EXPECT_EQ(connection->sub_status(), | |
| 435 MockBluetoothLowEnergyConnection::SubStatus::DISCONNECTED); | |
| 436 EXPECT_EQ(connection->status(), Connection::DISCONNECTED); | |
| 437 } | |
| 438 | |
| 439 TEST_F(ProximityAuthBluetoothLowEnergyConnectionTest, | |
| 440 Connect_Fails_ErrorSendingInviteToConnectSignal) { | |
| 441 scoped_ptr<MockBluetoothLowEnergyConnection> connection(CreateConnection()); | |
| 442 ConnectWithExistingGattConnection(connection.get()); | |
| 443 CharacteristicsFound(connection.get()); | |
| 444 NotifySessionStarted(connection.get()); | |
| 445 | |
| 446 // |connection| will call WriteRemoteCharacteristics(_,_) to try to send the | |
| 447 // message |kMaxNumberOfTries| times. There is alredy one EXPECTA_CALL for | |
| 448 // WriteRemoteCharacteristic(_,_,_) in NotifySessionStated, that's why we use | |
| 449 // |kMaxNumberOfTries-1| in the EXPECT_CALL statement. | |
| 450 EXPECT_CALL(*connection, OnDidSendMessage(_, _)).Times(0); | |
| 451 EXPECT_CALL(*to_peripheral_char_, WriteRemoteCharacteristic(_, _, _)) | |
| 452 .Times(kMaxNumberOfTries - 1) | |
| 453 .WillRepeatedly( | |
| 454 DoAll(SaveArg<0>(&last_value_written_on_to_peripheral_char_), | |
| 455 SaveArg<1>(&write_remote_characteristic_success_callback_), | |
| 456 SaveArg<2>(&write_remote_characteristic_error_callback_))); | |
| 457 | |
| 458 for (int i = 0; i < kMaxNumberOfTries; i++) { | |
| 459 const std::vector<uint8> kSendSignal = {0, 0, 0, 0}; | |
| 460 EXPECT_EQ(last_value_written_on_to_peripheral_char_, kSendSignal); | |
| 461 ASSERT_FALSE(write_remote_characteristic_error_callback_.is_null()); | |
| 462 EXPECT_FALSE(write_remote_characteristic_success_callback_.is_null()); | |
| 463 write_remote_characteristic_error_callback_.Run( | |
| 464 device::BluetoothGattService::GATT_ERROR_UNKNOWN); | |
| 465 } | |
| 466 | |
| 467 EXPECT_EQ(connection->sub_status(), | |
| 468 MockBluetoothLowEnergyConnection::SubStatus::DISCONNECTED); | |
| 469 EXPECT_EQ(connection->status(), Connection::DISCONNECTED); | |
| 470 } | |
| 471 | |
| 472 TEST_F(ProximityAuthBluetoothLowEnergyConnectionTest, | |
| 473 Connect_Fails_CharacteristicsNotFound_WithoutExistingGattConnection) { | |
| 474 scoped_ptr<MockBluetoothLowEnergyConnection> connection(CreateConnection()); | |
| 475 ConnectWithoutExistingGattConnection(connection.get()); | |
| 476 | |
| 477 EXPECT_CALL(*from_peripheral_char_, StartNotifySession(_, _)).Times(0); | |
| 478 EXPECT_FALSE(characteristics_finder_success_callback_.is_null()); | |
| 479 ASSERT_FALSE(characteristics_finder_error_callback_.is_null()); | |
| 480 | |
| 481 characteristics_finder_error_callback_.Run( | |
| 482 {to_peripheral_char_uuid_, kToPeripheralCharID}, | |
| 483 {from_peripheral_char_uuid_, kFromPeripheralCharID}); | |
| 484 | |
| 485 EXPECT_EQ(connection->sub_status(), | |
| 486 MockBluetoothLowEnergyConnection::SubStatus::DISCONNECTED); | |
| 487 EXPECT_EQ(connection->status(), Connection::DISCONNECTED); | |
| 488 } | |
| 489 | |
| 490 } // namespace proximity_auth | |
| OLD | NEW |