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

Side by Side Diff: components/proximity_auth/ble/bluetooth_low_energy_weave_client_connection_unittest.cc

Issue 2075313002: Substituting legacy protocol with uWeave protocol (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: updated gyp build files Created 4 years, 5 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
(Empty)
1 // Copyright 2016 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_weave_client_connec tion.h"
6
7 #include <stdint.h>
8
9 #include <memory>
10 #include <utility>
11
12 #include "base/bind.h"
13 #include "base/memory/ptr_util.h"
14 #include "base/message_loop/message_loop.h"
15 #include "base/run_loop.h"
16 #include "base/test/test_simple_task_runner.h"
17 #include "components/proximity_auth/bluetooth_throttler.h"
18 #include "components/proximity_auth/connection_finder.h"
19 #include "components/proximity_auth/connection_observer.h"
20 #include "components/proximity_auth/proximity_auth_test_util.h"
21 #include "components/proximity_auth/remote_device.h"
22 #include "components/proximity_auth/wire_message.h"
23 #include "device/bluetooth/bluetooth_adapter_factory.h"
24 #include "device/bluetooth/test/mock_bluetooth_adapter.h"
25 #include "device/bluetooth/test/mock_bluetooth_device.h"
26 #include "device/bluetooth/test/mock_bluetooth_discovery_session.h"
27 #include "device/bluetooth/test/mock_bluetooth_gatt_characteristic.h"
28 #include "device/bluetooth/test/mock_bluetooth_gatt_connection.h"
29 #include "device/bluetooth/test/mock_bluetooth_gatt_notify_session.h"
30 #include "testing/gmock/include/gmock/gmock.h"
31 #include "testing/gtest/include/gtest/gtest.h"
32
33 using testing::_;
34 using testing::AtLeast;
35 using testing::NiceMock;
36 using testing::Return;
37 using testing::StrictMock;
38 using testing::SaveArg;
39
40 namespace proximity_auth {
41 namespace {
42
43 class MockBluetoothThrottler : public BluetoothThrottler {
44 public:
45 MockBluetoothThrottler() {}
46 ~MockBluetoothThrottler() override {}
47
48 MOCK_CONST_METHOD0(GetDelay, base::TimeDelta());
49 MOCK_METHOD1(OnConnection, void(Connection* connection));
50
51 private:
52 DISALLOW_COPY_AND_ASSIGN(MockBluetoothThrottler);
53 };
54
55 class MockBluetoothLowEnergyCharacteristicsFinder
56 : public BluetoothLowEnergyCharacteristicsFinder {
57 public:
58 MockBluetoothLowEnergyCharacteristicsFinder() {}
59 ~MockBluetoothLowEnergyCharacteristicsFinder() override {}
60
61 private:
62 DISALLOW_COPY_AND_ASSIGN(MockBluetoothLowEnergyCharacteristicsFinder);
63 };
64
65 class MockConnectionObserver : public ConnectionObserver {
66 public:
67 MockConnectionObserver() : num_send_completed_(0) {}
68
69 void OnConnectionStatusChanged(Connection* connection,
70 Connection::Status old_status,
71 Connection::Status new_status) override {}
72
73 void OnMessageReceived(const Connection& connection,
74 const WireMessage& message) override {}
75
76 void OnSendCompleted(const Connection& conenction,
77 const WireMessage& message,
78 bool success) override {
79 last_deserialized_message_ = message.payload();
80 last_send_success_ = success;
81 num_send_completed_++;
82 }
83
84 std::string GetLastDeserializedMessage() {
85 return last_deserialized_message_;
86 }
87
88 bool GetLastSendSuccess() { return last_send_success_; }
89
90 int GetNumSendCompleted() { return num_send_completed_; }
91
92 private:
93 std::string last_deserialized_message_;
94 bool last_send_success_;
95 int num_send_completed_;
96 };
97
98 } // namespace
99
100 namespace weave {
101 namespace {
102
103 typedef BluetoothLowEnergyWeaveClientConnection::SubStatus SubStatus;
104 typedef BluetoothLowEnergyWeavePacketReceiver::State ReceiverState;
105 typedef BluetoothLowEnergyWeavePacketReceiver::ReceiverError ReceiverError;
106 typedef BluetoothLowEnergyWeavePacketReceiver::ReceiverType ReceiverType;
107
108 const char kServiceUUID[] = "DEADBEEF-CAFE-FEED-FOOD-D15EA5EBEEEF";
109 const char kTXCharacteristicUUID[] = "977c6674-1239-4e72-993b-502369b8bb5a";
110 const char kRXCharacteristicUUID[] = "f4b904a2-a030-43b3-98a8-221c536c03cb";
111
112 const char kServiceID[] = "service id";
113 const char kTXCharacteristicID[] = "TX characteristic id";
114 const char kRXCharacteristicID[] = "RX characteristic id";
115
116 const device::BluetoothRemoteGattCharacteristic::Properties
117 kCharacteristicProperties =
118 device::BluetoothRemoteGattCharacteristic::PROPERTY_BROADCAST |
119 device::BluetoothRemoteGattCharacteristic::PROPERTY_READ |
120 device::BluetoothRemoteGattCharacteristic::
121 PROPERTY_WRITE_WITHOUT_RESPONSE |
122 device::BluetoothRemoteGattCharacteristic::PROPERTY_INDICATE;
123
124 const int kMaxNumberOfTries = 3;
125 const uint16_t kLargeMaxPacketSize = 30;
126
127 const uint8_t kDataHeader = 0;
128 const uint8_t kConnectionRequestHeader = 1;
129 const uint8_t kSmallConnectionResponseHeader = 2;
130 const uint8_t kLargeConnectionResponseHeader = 3;
131 const uint8_t kConnectionCloseHeader = 4;
132 const uint8_t kErroneousHeader = 5;
133
134 const std::string kSmallMessage = "bb";
135 const std::string kLargeMessage = "aaabbb";
136 const std::string kLargeMessage0 = "aaa";
137 const std::string kLargeMessage1 = "bbb";
138
139 const Packet kConnectionRequest{kConnectionRequestHeader};
140 const Packet kSmallConnectionResponse{kSmallConnectionResponseHeader};
141 const Packet kLargeConnectionResponse{kLargeConnectionResponseHeader};
142 const Packet kConnectionCloseSuccess{kConnectionCloseHeader,
143 ReasonForClose::CLOSE_WITHOUT_ERROR};
144 const Packet kConnectionCloseUnknownError{kConnectionCloseHeader,
145 ReasonForClose::UNKNOWN_ERROR};
146 const Packet kConnectionCloseApplicationError{
147 kConnectionCloseHeader, ReasonForClose::APPLICATION_ERROR};
148
149 const Packet kSmallPackets0 = Packet{kDataHeader, 'b', 'b'};
150 const Packet kLargePackets0 = Packet{kDataHeader, 'a', 'a', 'a'};
151 const Packet kLargePackets1 = Packet{kDataHeader, 'b', 'b', 'b'};
152 const Packet kErroneousPacket = Packet{kErroneousHeader};
153
154 const std::vector<Packet> kSmallPackets{kSmallPackets0};
155 const std::vector<Packet> kLargePackets{kLargePackets0, kLargePackets1};
156
157 class MockBluetoothLowEnergyWeavePacketGenerator
158 : public BluetoothLowEnergyWeavePacketGenerator {
159 public:
160 MockBluetoothLowEnergyWeavePacketGenerator()
161 : max_packet_size_(kDefaultMaxPacketSize) {}
162
163 Packet CreateConnectionRequest() override { return kConnectionRequest; }
164
165 Packet CreateConnectionResponse() override {
166 NOTIMPLEMENTED();
167 return Packet();
168 }
169
170 Packet CreateConnectionClose(ReasonForClose reason_for_close) override {
171 return Packet{kConnectionCloseHeader,
172 static_cast<uint8_t>(reason_for_close)};
173 }
174
175 void SetMaxPacketSize(uint16_t size) override { max_packet_size_ = size; }
176
177 std::vector<Packet> EncodeDataMessage(std::string message) override {
178 if (message == kSmallMessage && max_packet_size_ == kDefaultMaxPacketSize) {
179 return kSmallPackets;
180 } else if (message == kLargeMessage &&
181 max_packet_size_ == kLargeMaxPacketSize) {
182 return kLargePackets;
183 } else {
184 NOTREACHED();
185 return std::vector<Packet>();
186 }
187 }
188
189 uint16_t GetMaxPacketSize() { return max_packet_size_; }
190
191 private:
192 uint16_t max_packet_size_;
193 };
194
195 class MockBluetoothLowEnergyWeavePacketReceiver
196 : public BluetoothLowEnergyWeavePacketReceiver {
197 public:
198 MockBluetoothLowEnergyWeavePacketReceiver()
199 : BluetoothLowEnergyWeavePacketReceiver(ReceiverType::CLIENT),
200 state_(State::CONNECTING),
201 max_packet_size_(kDefaultMaxPacketSize),
202 reason_for_close_(ReasonForClose::CLOSE_WITHOUT_ERROR),
203 reason_to_close_(ReasonForClose::CLOSE_WITHOUT_ERROR) {}
204
205 ReceiverState GetState() override { return state_; }
206
207 uint16_t GetMaxPacketSize() override { return max_packet_size_; }
208
209 ReasonForClose GetReasonForClose() override { return reason_for_close_; }
210
211 ReasonForClose GetReasonToClose() override { return reason_to_close_; }
212
213 std::string GetDataMessage() override {
214 if (max_packet_size_ == kDefaultMaxPacketSize) {
215 return kSmallMessage;
216 } else {
217 return kLargeMessage;
218 }
219 }
220
221 ReceiverError GetReceiverError() override {
222 return ReceiverError::NO_ERROR_DETECTED;
223 }
224
225 ReceiverState ReceivePacket(const Packet& packet) override {
226 switch (packet[0]) {
227 case kSmallConnectionResponseHeader:
228 max_packet_size_ = kDefaultMaxPacketSize;
229 state_ = ReceiverState::WAITING;
230 break;
231 case kLargeConnectionResponseHeader:
232 max_packet_size_ = kLargeMaxPacketSize;
233 state_ = ReceiverState::WAITING;
234 break;
235 case kConnectionCloseHeader:
236 state_ = ReceiverState::CONNECTION_CLOSED;
237 reason_for_close_ = static_cast<ReasonForClose>(packet[1]);
238 break;
239 case kDataHeader:
240 if (packet == kSmallPackets0 || packet == kLargePackets1) {
241 state_ = ReceiverState::DATA_READY;
242 } else {
243 state_ = ReceiverState::RECEIVING_DATA;
244 }
245 break;
246 default:
247 reason_to_close_ = ReasonForClose::APPLICATION_ERROR;
248 state_ = ReceiverState::ERROR_DETECTED;
249 }
250 return state_;
251 }
252
253 private:
254 ReceiverState state_;
255 uint16_t max_packet_size_;
256 ReasonForClose reason_for_close_;
257 ReasonForClose reason_to_close_;
258 };
259
260 class MockBluetoothLowEnergyWeavePacketGeneratorFactory
261 : public BluetoothLowEnergyWeavePacketGenerator::Factory {
262 public:
263 // most_recent_instance_ will be obsolete after the connection class
264 // destructs. Do not use if that's the case.
265 MockBluetoothLowEnergyWeavePacketGenerator* GetMostRecentInstance() {
266 return most_recent_instance_;
267 }
268
269 private:
270 std::unique_ptr<BluetoothLowEnergyWeavePacketGenerator> BuildInstance()
271 override {
272 most_recent_instance_ = new MockBluetoothLowEnergyWeavePacketGenerator();
273 return std::unique_ptr<BluetoothLowEnergyWeavePacketGenerator>(
274 most_recent_instance_);
275 }
276
277 MockBluetoothLowEnergyWeavePacketGenerator* most_recent_instance_;
278 };
279
280 class MockBluetoothLowEnergyWeavePacketReceiverFactory
281 : public BluetoothLowEnergyWeavePacketReceiver::Factory {
282 public:
283 // most_recent_instance_ will be obsolete after the connection class
284 // destructs. Do not use if that's the case.
285 MockBluetoothLowEnergyWeavePacketReceiver* GetMostRecentInstance() {
286 return most_recent_instance_;
287 }
288
289 private:
290 std::unique_ptr<BluetoothLowEnergyWeavePacketReceiver> BuildInstance(
291 ReceiverType receiver_type) override {
292 most_recent_instance_ = new MockBluetoothLowEnergyWeavePacketReceiver();
293 return std::unique_ptr<BluetoothLowEnergyWeavePacketReceiver>(
294 most_recent_instance_);
295 }
296
297 MockBluetoothLowEnergyWeavePacketReceiver* most_recent_instance_;
298 };
299
300 class TestBluetoothLowEnergyWeaveClientConnection
301 : public BluetoothLowEnergyWeaveClientConnection {
302 public:
303 TestBluetoothLowEnergyWeaveClientConnection(
304 const RemoteDevice& remote_device,
305 scoped_refptr<device::BluetoothAdapter> adapter,
306 const device::BluetoothUUID remote_service_uuid,
307 BluetoothThrottler* bluetooth_throttler,
308 int max_number_of_write_attempts)
309 : BluetoothLowEnergyWeaveClientConnection(remote_device,
310 adapter,
311 remote_service_uuid,
312 bluetooth_throttler,
313 max_number_of_write_attempts) {}
314
315 ~TestBluetoothLowEnergyWeaveClientConnection() override {}
316
317 MOCK_METHOD2(
318 CreateCharacteristicsFinder,
319 BluetoothLowEnergyCharacteristicsFinder*(
320 const BluetoothLowEnergyCharacteristicsFinder::SuccessCallback&
321 success,
322 const BluetoothLowEnergyCharacteristicsFinder::ErrorCallback& error));
323
324 MOCK_METHOD1(OnBytesReceived, void(const std::string& bytes));
325
326 // Exposing inherited protected methods for testing.
327 using BluetoothLowEnergyWeaveClientConnection::GattCharacteristicValueChanged;
328 using BluetoothLowEnergyWeaveClientConnection::SetTaskRunnerForTesting;
329 using BluetoothLowEnergyWeaveClientConnection::DestroyConnection;
330 using BluetoothLowEnergyWeaveClientConnection::GetNumPendingMessages;
331
332 // Exposing inherited protected fields for testing.
333 using BluetoothLowEnergyWeaveClientConnection::status;
334 using BluetoothLowEnergyWeaveClientConnection::sub_status;
335
336 private:
337 DISALLOW_COPY_AND_ASSIGN(TestBluetoothLowEnergyWeaveClientConnection);
338 };
339
340 } // namespace
341
342 class ProximityAuthBluetoothLowEnergyWeaveClientConnectionTest
343 : public testing::Test {
344 public:
345 ProximityAuthBluetoothLowEnergyWeaveClientConnectionTest()
346 : adapter_(new NiceMock<device::MockBluetoothAdapter>),
347 remote_device_(CreateLERemoteDeviceForTest()),
348 service_uuid_(device::BluetoothUUID(kServiceUUID)),
349 tx_characteristic_uuid_(device::BluetoothUUID(kTXCharacteristicUUID)),
350 rx_characteristic_uuid_(device::BluetoothUUID(kRXCharacteristicUUID)),
351 notify_session_alias_(NULL),
352 bluetooth_throttler_(new NiceMock<MockBluetoothThrottler>),
353 task_runner_(new base::TestSimpleTaskRunner),
354 last_completed_wire_message_("") {
355 BluetoothLowEnergyWeavePacketGenerator::Factory::SetInstanceForTesting(
356 &generator_factory_);
357 BluetoothLowEnergyWeavePacketReceiver::Factory::SetInstanceForTesting(
358 &receiver_factory_);
359 }
360
361 void SetUp() override {
362 device_ = base::WrapUnique(new NiceMock<device::MockBluetoothDevice>(
363 adapter_.get(), 0, kTestRemoteDeviceName,
364 kTestRemoteDeviceBluetoothAddress, false, false));
365
366 service_ = base::WrapUnique(new NiceMock<device::MockBluetoothGattService>(
367 device_.get(), kServiceID, service_uuid_, true, false));
368 tx_characteristic_ =
369 base::WrapUnique(new NiceMock<device::MockBluetoothGattCharacteristic>(
370 service_.get(), kTXCharacteristicID, tx_characteristic_uuid_, false,
371 kCharacteristicProperties,
372 device::BluetoothRemoteGattCharacteristic::PERMISSION_NONE));
373
374 rx_characteristic_ =
375 base::WrapUnique(new NiceMock<device::MockBluetoothGattCharacteristic>(
376 service_.get(), kRXCharacteristicID, rx_characteristic_uuid_, false,
377 kCharacteristicProperties,
378 device::BluetoothRemoteGattCharacteristic::PERMISSION_NONE));
379
380 device::BluetoothAdapterFactory::SetAdapterForTesting(adapter_);
381
382 std::vector<const device::BluetoothDevice*> devices;
383 devices.push_back(device_.get());
384 ON_CALL(*adapter_, GetDevices()).WillByDefault(Return(devices));
385 ON_CALL(*adapter_, GetDevice(kTestRemoteDeviceBluetoothAddress))
386 .WillByDefault(Return(device_.get()));
387 ON_CALL(*device_, GetGattService(kServiceID))
388 .WillByDefault(Return(service_.get()));
389 ON_CALL(*service_, GetCharacteristic(kRXCharacteristicID))
390 .WillByDefault(Return(rx_characteristic_.get()));
391 ON_CALL(*service_, GetCharacteristic(kTXCharacteristicID))
392 .WillByDefault(Return(tx_characteristic_.get()));
393 }
394
395 // Creates a BluetoothLowEnergyWeaveClientConnection and verifies it's in
396 // DISCONNECTED state.
397 std::unique_ptr<TestBluetoothLowEnergyWeaveClientConnection>
398 CreateConnection() {
399 EXPECT_CALL(*adapter_, AddObserver(_));
400 EXPECT_CALL(*adapter_, RemoveObserver(_));
401
402 std::unique_ptr<TestBluetoothLowEnergyWeaveClientConnection> connection(
403 new TestBluetoothLowEnergyWeaveClientConnection(
404 remote_device_, adapter_, service_uuid_, bluetooth_throttler_.get(),
405 kMaxNumberOfTries));
406
407 EXPECT_EQ(connection->sub_status(), SubStatus::DISCONNECTED);
408 EXPECT_EQ(connection->status(), Connection::DISCONNECTED);
409
410 // Add the mock observer to observe on OnDidMessageSend.
411 connection->AddObserver(&connection_observer_);
412
413 connection->SetTaskRunnerForTesting(task_runner_);
414
415 return connection;
416 }
417
418 // Transitions |connection| from DISCONNECTED to WAITING_CHARACTERISTICS
419 // state, without an existing GATT connection.
420 void ConnectGatt(TestBluetoothLowEnergyWeaveClientConnection* connection) {
421 // Preparing |connection| for a CreateGattConnection call.
422 EXPECT_CALL(*device_, CreateGattConnection(_, _))
423 .WillOnce(DoAll(SaveArg<0>(&create_gatt_connection_success_callback_),
424 SaveArg<1>(&create_gatt_connection_error_callback_)));
425
426 // No throttling by default
427 EXPECT_CALL(*bluetooth_throttler_, GetDelay())
428 .WillOnce(Return(base::TimeDelta()));
429
430 connection->Connect();
431
432 EXPECT_EQ(connection->sub_status(), SubStatus::WAITING_GATT_CONNECTION);
433 EXPECT_EQ(connection->status(), Connection::IN_PROGRESS);
434
435 // Preparing |connection| to run |create_gatt_connection_success_callback_|.
436 EXPECT_FALSE(create_gatt_connection_error_callback_.is_null());
437 ASSERT_FALSE(create_gatt_connection_success_callback_.is_null());
438 EXPECT_CALL(*connection, CreateCharacteristicsFinder(_, _))
439 .WillOnce(DoAll(
440 SaveArg<0>(&characteristics_finder_success_callback_),
441 SaveArg<1>(&characteristics_finder_error_callback_),
442 Return(new NiceMock<MockBluetoothLowEnergyCharacteristicsFinder>)));
443
444 create_gatt_connection_success_callback_.Run(
445 base::WrapUnique(new NiceMock<device::MockBluetoothGattConnection>(
446 adapter_, kTestRemoteDeviceBluetoothAddress)));
447
448 EXPECT_EQ(connection->sub_status(), SubStatus::WAITING_CHARACTERISTICS);
449 EXPECT_EQ(connection->status(), Connection::IN_PROGRESS);
450 }
451
452 // Transitions |connection| from WAITING_CHARACTERISTICS to
453 // WAITING_NOTIFY_SESSION state.
454 void CharacteristicsFound(
455 TestBluetoothLowEnergyWeaveClientConnection* connection) {
456 EXPECT_CALL(*rx_characteristic_, StartNotifySession(_, _))
457 .WillOnce(DoAll(SaveArg<0>(&notify_session_success_callback_),
458 SaveArg<1>(&notify_session_error_callback_)));
459 EXPECT_FALSE(characteristics_finder_error_callback_.is_null());
460 ASSERT_FALSE(characteristics_finder_success_callback_.is_null());
461
462 characteristics_finder_success_callback_.Run(
463 {service_uuid_, kServiceID},
464 {tx_characteristic_uuid_, kTXCharacteristicID},
465 {rx_characteristic_uuid_, kRXCharacteristicID});
466
467 EXPECT_EQ(connection->sub_status(), SubStatus::WAITING_NOTIFY_SESSION);
468 EXPECT_EQ(connection->status(), Connection::IN_PROGRESS);
469 }
470
471 // Transitions |connection| from WAITING_NOTIFY_SESSION to
472 // WAITING_CONNECTION_RESPONSE state.
473 void NotifySessionStarted(
474 TestBluetoothLowEnergyWeaveClientConnection* connection) {
475 EXPECT_CALL(*tx_characteristic_, WriteRemoteCharacteristic(_, _, _))
476 .WillOnce(
477 DoAll(SaveArg<0>(&last_value_written_on_tx_characteristic_),
478 SaveArg<1>(&write_remote_characteristic_success_callback_),
479 SaveArg<2>(&write_remote_characteristic_error_callback_)));
480 EXPECT_FALSE(notify_session_error_callback_.is_null());
481 ASSERT_FALSE(notify_session_success_callback_.is_null());
482
483 // Store an alias for the notify session passed |connection|.
484 std::unique_ptr<device::MockBluetoothGattNotifySession> notify_session(
485 new NiceMock<device::MockBluetoothGattNotifySession>(
486 kTXCharacteristicID));
487 notify_session_alias_ = notify_session.get();
488
489 notify_session_success_callback_.Run(std::move(notify_session));
490 task_runner_->RunUntilIdle();
491
492 // Written value contains only the mock Connection Request.
493 EXPECT_EQ(last_value_written_on_tx_characteristic_, kConnectionRequest);
494
495 EXPECT_EQ(connection->sub_status(), SubStatus::WAITING_CONNECTION_RESPONSE);
496 EXPECT_EQ(connection->status(), Connection::IN_PROGRESS);
497 }
498
499 // Transitions |connection| from WAITING_CONNECTION_RESPONSE to CONNECTED.
500 void ConnectionResponseReceived(
501 TestBluetoothLowEnergyWeaveClientConnection* connection,
502 uint16_t selected_packet_size) {
503 // Written value contains only the mock Connection Request.
504 EXPECT_EQ(last_value_written_on_tx_characteristic_, kConnectionRequest);
505
506 // OnDidSendMessage is not called.
507 EXPECT_EQ(0, connection_observer_.GetNumSendCompleted());
508
509 RunWriteCharacteristicSuccessCallback();
510
511 // Received Connection Response.
512 if (selected_packet_size == kDefaultMaxPacketSize) {
513 connection->GattCharacteristicValueChanged(
514 adapter_.get(), rx_characteristic_.get(), kSmallConnectionResponse);
515 EXPECT_EQ(receiver_factory_.GetMostRecentInstance()->GetMaxPacketSize(),
516 kDefaultMaxPacketSize);
517 EXPECT_EQ(generator_factory_.GetMostRecentInstance()->GetMaxPacketSize(),
518 kDefaultMaxPacketSize);
519 } else if (selected_packet_size == kLargeMaxPacketSize) {
520 connection->GattCharacteristicValueChanged(
521 adapter_.get(), rx_characteristic_.get(), kLargeConnectionResponse);
522 EXPECT_EQ(receiver_factory_.GetMostRecentInstance()->GetMaxPacketSize(),
523 kLargeMaxPacketSize);
524 EXPECT_EQ(generator_factory_.GetMostRecentInstance()->GetMaxPacketSize(),
525 kLargeMaxPacketSize);
526 } else {
527 NOTREACHED();
528 }
529
530 EXPECT_EQ(connection->sub_status(), SubStatus::CONNECTED);
531 EXPECT_EQ(connection->status(), Connection::CONNECTED);
532 }
533
534 // Transitions |connection| to a DISCONNECTED state regardless of its initial
535 // state.
536 void Disconnect(TestBluetoothLowEnergyWeaveClientConnection* connection) {
537 // A notify session was previously set.
538 if (notify_session_alias_)
539 EXPECT_CALL(*notify_session_alias_, Stop(_));
540
541 if (connection->sub_status() == SubStatus::CONNECTED) {
542 EXPECT_CALL(*tx_characteristic_, WriteRemoteCharacteristic(_, _, _))
543 .WillOnce(
544 DoAll(SaveArg<0>(&last_value_written_on_tx_characteristic_),
545 SaveArg<1>(&write_remote_characteristic_success_callback_),
546 SaveArg<2>(&write_remote_characteristic_error_callback_)));
547 }
548
549 connection->Disconnect();
550
551 if (connection->sub_status() == SubStatus::CONNECTED) {
552 connection->DestroyConnection();
553 EXPECT_EQ(last_value_written_on_tx_characteristic_,
554 kConnectionCloseSuccess);
555 RunWriteCharacteristicSuccessCallback();
556 }
557
558 EXPECT_EQ(connection->sub_status(), SubStatus::DISCONNECTED);
559 EXPECT_EQ(connection->status(), Connection::DISCONNECTED);
560 }
561
562 void InitializeConnection(
563 TestBluetoothLowEnergyWeaveClientConnection* connection,
564 uint32_t selected_packet_size) {
565 ConnectGatt(connection);
566 CharacteristicsFound(connection);
567 NotifySessionStarted(connection);
568 ConnectionResponseReceived(connection, selected_packet_size);
569 }
570
571 void RunWriteCharacteristicSuccessCallback() {
572 EXPECT_FALSE(write_remote_characteristic_error_callback_.is_null());
573 ASSERT_FALSE(write_remote_characteristic_success_callback_.is_null());
574 write_remote_characteristic_success_callback_.Run();
575 }
576
577 protected:
578 scoped_refptr<device::MockBluetoothAdapter> adapter_;
579 RemoteDevice remote_device_;
580 device::BluetoothUUID service_uuid_;
581 device::BluetoothUUID tx_characteristic_uuid_;
582 device::BluetoothUUID rx_characteristic_uuid_;
583 std::unique_ptr<device::MockBluetoothDevice> device_;
584 std::unique_ptr<device::MockBluetoothGattService> service_;
585 std::unique_ptr<device::MockBluetoothGattCharacteristic> tx_characteristic_;
586 std::unique_ptr<device::MockBluetoothGattCharacteristic> rx_characteristic_;
587 std::vector<uint8_t> last_value_written_on_tx_characteristic_;
588 device::MockBluetoothGattNotifySession* notify_session_alias_;
589 std::unique_ptr<MockBluetoothThrottler> bluetooth_throttler_;
590 scoped_refptr<base::TestSimpleTaskRunner> task_runner_;
591 base::MessageLoop message_loop_;
592 WireMessage last_completed_wire_message_;
593 bool last_wire_message_success_;
594 MockBluetoothLowEnergyWeavePacketGeneratorFactory generator_factory_;
595 MockBluetoothLowEnergyWeavePacketReceiverFactory receiver_factory_;
596 MockConnectionObserver connection_observer_;
597
598 // Callbacks
599 device::BluetoothDevice::GattConnectionCallback
600 create_gatt_connection_success_callback_;
601 device::BluetoothDevice::ConnectErrorCallback
602 create_gatt_connection_error_callback_;
603
604 BluetoothLowEnergyCharacteristicsFinder::SuccessCallback
605 characteristics_finder_success_callback_;
606 BluetoothLowEnergyCharacteristicsFinder::ErrorCallback
607 characteristics_finder_error_callback_;
608
609 device::BluetoothRemoteGattCharacteristic::NotifySessionCallback
610 notify_session_success_callback_;
611 device::BluetoothRemoteGattCharacteristic::ErrorCallback
612 notify_session_error_callback_;
613
614 base::Closure write_remote_characteristic_success_callback_;
615 device::BluetoothRemoteGattCharacteristic::ErrorCallback
616 write_remote_characteristic_error_callback_;
617 };
618
619 TEST_F(ProximityAuthBluetoothLowEnergyWeaveClientConnectionTest,
620 CreateAndDestroyWithoutConnectCallDoesntCrash) {
621 BluetoothLowEnergyWeaveClientConnection connection(
622 remote_device_, adapter_, service_uuid_, bluetooth_throttler_.get(),
623 kMaxNumberOfTries);
624 }
625
626 TEST_F(ProximityAuthBluetoothLowEnergyWeaveClientConnectionTest,
627 DisconectWithoutConnectDoesntCrash) {
628 std::unique_ptr<TestBluetoothLowEnergyWeaveClientConnection> connection(
629 CreateConnection());
630 Disconnect(connection.get());
631 }
632
633 TEST_F(ProximityAuthBluetoothLowEnergyWeaveClientConnectionTest,
634 ConnectSuccess) {
635 std::unique_ptr<TestBluetoothLowEnergyWeaveClientConnection> connection(
636 CreateConnection());
637 ConnectGatt(connection.get());
638 CharacteristicsFound(connection.get());
639 NotifySessionStarted(connection.get());
640 ConnectionResponseReceived(connection.get(), kDefaultMaxPacketSize);
641 }
642
643 TEST_F(ProximityAuthBluetoothLowEnergyWeaveClientConnectionTest,
644 ConnectSuccessDisconnect) {
645 std::unique_ptr<TestBluetoothLowEnergyWeaveClientConnection> connection(
646 CreateConnection());
647 InitializeConnection(connection.get(), kDefaultMaxPacketSize);
648 EXPECT_EQ(connection->sub_status(), SubStatus::CONNECTED);
649 Disconnect(connection.get());
650 }
651
652 TEST_F(ProximityAuthBluetoothLowEnergyWeaveClientConnectionTest,
653 ConnectIncompleteDisconnectFromWaitingCharacteristicsState) {
654 std::unique_ptr<TestBluetoothLowEnergyWeaveClientConnection> connection(
655 CreateConnection());
656 ConnectGatt(connection.get());
657 Disconnect(connection.get());
658 }
659
660 TEST_F(ProximityAuthBluetoothLowEnergyWeaveClientConnectionTest,
661 ConnectIncompleteDisconnectFromWaitingNotifySessionState) {
662 std::unique_ptr<TestBluetoothLowEnergyWeaveClientConnection> connection(
663 CreateConnection());
664 ConnectGatt(connection.get());
665 CharacteristicsFound(connection.get());
666 Disconnect(connection.get());
667 }
668
669 TEST_F(ProximityAuthBluetoothLowEnergyWeaveClientConnectionTest,
670 ConnectIncompleteDisconnectFromWaitingConnectionResponseState) {
671 std::unique_ptr<TestBluetoothLowEnergyWeaveClientConnection> connection(
672 CreateConnection());
673 ConnectGatt(connection.get());
674 CharacteristicsFound(connection.get());
675 NotifySessionStarted(connection.get());
676 Disconnect(connection.get());
677 }
678
679 TEST_F(ProximityAuthBluetoothLowEnergyWeaveClientConnectionTest,
680 ConnectFailsCharacteristicsNotFound) {
681 std::unique_ptr<TestBluetoothLowEnergyWeaveClientConnection> connection(
682 CreateConnection());
683 ConnectGatt(connection.get());
684
685 EXPECT_CALL(*rx_characteristic_, StartNotifySession(_, _)).Times(0);
686 EXPECT_FALSE(characteristics_finder_success_callback_.is_null());
687 ASSERT_FALSE(characteristics_finder_error_callback_.is_null());
688
689 characteristics_finder_error_callback_.Run(
690 {tx_characteristic_uuid_, kTXCharacteristicID},
691 {rx_characteristic_uuid_, kRXCharacteristicID});
692
693 EXPECT_EQ(connection->sub_status(), SubStatus::DISCONNECTED);
694 EXPECT_EQ(connection->status(), Connection::DISCONNECTED);
695 }
696
697 TEST_F(ProximityAuthBluetoothLowEnergyWeaveClientConnectionTest,
698 ConnectFailsNotifySessionError) {
699 std::unique_ptr<TestBluetoothLowEnergyWeaveClientConnection> connection(
700 CreateConnection());
701 ConnectGatt(connection.get());
702 CharacteristicsFound(connection.get());
703
704 EXPECT_CALL(*tx_characteristic_, WriteRemoteCharacteristic(_, _, _)).Times(0);
705 EXPECT_FALSE(notify_session_success_callback_.is_null());
706 ASSERT_FALSE(notify_session_error_callback_.is_null());
707
708 notify_session_error_callback_.Run(
709 device::BluetoothRemoteGattService::GATT_ERROR_UNKNOWN);
710
711 EXPECT_EQ(connection->sub_status(), SubStatus::DISCONNECTED);
712 EXPECT_EQ(connection->status(), Connection::DISCONNECTED);
713 }
714
715 TEST_F(ProximityAuthBluetoothLowEnergyWeaveClientConnectionTest,
716 ConnectFailsErrorSendingConnectionRequest) {
717 std::unique_ptr<TestBluetoothLowEnergyWeaveClientConnection> connection(
718 CreateConnection());
719 ConnectGatt(connection.get());
720 CharacteristicsFound(connection.get());
721 NotifySessionStarted(connection.get());
722
723 // |connection| will call WriteRemoteCharacteristics(_,_) to try to send the
724 // message |kMaxNumberOfTries| times. There is alredy one EXPECTA_CALL for
725 // WriteRemoteCharacteristic(_,_,_) in NotifySessionStated, that's why we use
726 // |kMaxNumberOfTries-1| in the EXPECT_CALL statement.
727 EXPECT_EQ(0, connection_observer_.GetNumSendCompleted());
728 EXPECT_CALL(*tx_characteristic_, WriteRemoteCharacteristic(_, _, _))
729 .Times(kMaxNumberOfTries - 1)
730 .WillRepeatedly(
731 DoAll(SaveArg<0>(&last_value_written_on_tx_characteristic_),
732 SaveArg<1>(&write_remote_characteristic_success_callback_),
733 SaveArg<2>(&write_remote_characteristic_error_callback_)));
734
735 for (int i = 0; i < kMaxNumberOfTries; i++) {
736 EXPECT_EQ(last_value_written_on_tx_characteristic_, kConnectionRequest);
737 ASSERT_FALSE(write_remote_characteristic_error_callback_.is_null());
738 EXPECT_FALSE(write_remote_characteristic_success_callback_.is_null());
739 write_remote_characteristic_error_callback_.Run(
740 device::BluetoothRemoteGattService::GATT_ERROR_UNKNOWN);
741 }
742
743 EXPECT_EQ(connection->sub_status(), SubStatus::DISCONNECTED);
744 EXPECT_EQ(connection->status(), Connection::DISCONNECTED);
745 }
746
747 TEST_F(ProximityAuthBluetoothLowEnergyWeaveClientConnectionTest,
748 ReceiveMessageSmallerThanCharacteristicSize) {
749 std::unique_ptr<TestBluetoothLowEnergyWeaveClientConnection> connection(
750 CreateConnection());
751 InitializeConnection(connection.get(), kDefaultMaxPacketSize);
752
753 std::string received_bytes;
754 EXPECT_CALL(*connection, OnBytesReceived(_))
755 .WillOnce(SaveArg<0>(&received_bytes));
756
757 connection->GattCharacteristicValueChanged(
758 adapter_.get(), rx_characteristic_.get(), kSmallPackets0);
759
760 EXPECT_EQ(received_bytes, kSmallMessage);
761 }
762
763 TEST_F(ProximityAuthBluetoothLowEnergyWeaveClientConnectionTest,
764 ReceiveMessageLargerThanCharacteristicSize) {
765 std::unique_ptr<TestBluetoothLowEnergyWeaveClientConnection> connection(
766 CreateConnection());
767
768 InitializeConnection(connection.get(), kLargeMaxPacketSize);
769
770 std::string received_bytes;
771 EXPECT_CALL(*connection, OnBytesReceived(_))
772 .WillOnce(SaveArg<0>(&received_bytes));
773
774 std::vector<Packet> packets = kLargePackets;
775
776 for (auto packet : packets) {
777 connection->GattCharacteristicValueChanged(
778 adapter_.get(), rx_characteristic_.get(), packet);
779 }
780 EXPECT_EQ(received_bytes, kLargeMessage);
781 }
782
783 TEST_F(ProximityAuthBluetoothLowEnergyWeaveClientConnectionTest,
784 SendMessageSmallerThanCharacteristicSize) {
785 std::unique_ptr<TestBluetoothLowEnergyWeaveClientConnection> connection(
786 CreateConnection());
787 InitializeConnection(connection.get(), kDefaultMaxPacketSize);
788
789 // Expecting a first call of WriteRemoteCharacteristic, after SendMessage is
790 // called.
791 EXPECT_CALL(*tx_characteristic_, WriteRemoteCharacteristic(_, _, _))
792 .WillOnce(
793 DoAll(SaveArg<0>(&last_value_written_on_tx_characteristic_),
794 SaveArg<1>(&write_remote_characteristic_success_callback_),
795 SaveArg<2>(&write_remote_characteristic_error_callback_)));
796
797 connection->SendMessage(base::WrapUnique(new FakeWireMessage(kSmallMessage)));
798
799 EXPECT_EQ(last_value_written_on_tx_characteristic_, kSmallPackets0);
800 EXPECT_EQ(1, connection->GetNumPendingMessages());
801
802 RunWriteCharacteristicSuccessCallback();
803
804 EXPECT_EQ(0, connection->GetNumPendingMessages());
805 EXPECT_EQ(1, connection_observer_.GetNumSendCompleted());
806 EXPECT_EQ(kSmallMessage, connection_observer_.GetLastDeserializedMessage());
807 EXPECT_EQ(true, connection_observer_.GetLastSendSuccess());
808 }
809
810 TEST_F(ProximityAuthBluetoothLowEnergyWeaveClientConnectionTest,
811 SendMessageLargerThanCharacteristicSize) {
812 std::unique_ptr<TestBluetoothLowEnergyWeaveClientConnection> connection(
813 CreateConnection());
814
815 InitializeConnection(connection.get(), kLargeMaxPacketSize);
816
817 // Expecting a first call of WriteRemoteCharacteristic, after SendMessage is
818 // called.
819 EXPECT_CALL(*tx_characteristic_, WriteRemoteCharacteristic(_, _, _))
820 .WillOnce(
821 DoAll(SaveArg<0>(&last_value_written_on_tx_characteristic_),
822 SaveArg<1>(&write_remote_characteristic_success_callback_),
823 SaveArg<2>(&write_remote_characteristic_error_callback_)));
824
825 connection->SendMessage(base::WrapUnique(new FakeWireMessage(kLargeMessage)));
826
827 EXPECT_EQ(last_value_written_on_tx_characteristic_, kLargePackets0);
828 std::vector<uint8_t> bytes_received(
829 last_value_written_on_tx_characteristic_.begin() + 1,
830 last_value_written_on_tx_characteristic_.end());
831
832 EXPECT_CALL(*tx_characteristic_, WriteRemoteCharacteristic(_, _, _))
833 .WillOnce(
834 DoAll(SaveArg<0>(&last_value_written_on_tx_characteristic_),
835 SaveArg<1>(&write_remote_characteristic_success_callback_),
836 SaveArg<2>(&write_remote_characteristic_error_callback_)));
837
838 RunWriteCharacteristicSuccessCallback();
839 bytes_received.insert(bytes_received.end(),
840 last_value_written_on_tx_characteristic_.begin() + 1,
841 last_value_written_on_tx_characteristic_.end());
842
843 std::vector<uint8_t> expected(kLargeMessage.begin(), kLargeMessage.end());
844 EXPECT_EQ(expected, bytes_received);
845
846 EXPECT_EQ(1, connection->GetNumPendingMessages());
847
848 RunWriteCharacteristicSuccessCallback();
849
850 EXPECT_EQ(1, connection_observer_.GetNumSendCompleted());
851 EXPECT_EQ(kLargeMessage, connection_observer_.GetLastDeserializedMessage());
852 EXPECT_EQ(true, connection_observer_.GetLastSendSuccess());
853 EXPECT_EQ(0, connection->GetNumPendingMessages());
854 }
855
856 TEST_F(ProximityAuthBluetoothLowEnergyWeaveClientConnectionTest,
857 SendMessageKeepsFailing) {
858 std::unique_ptr<TestBluetoothLowEnergyWeaveClientConnection> connection(
859 CreateConnection());
860 InitializeConnection(connection.get(), kDefaultMaxPacketSize);
861
862 EXPECT_CALL(*tx_characteristic_, WriteRemoteCharacteristic(_, _, _))
863 .Times(kMaxNumberOfTries)
864 .WillRepeatedly(
865 DoAll(SaveArg<0>(&last_value_written_on_tx_characteristic_),
866 SaveArg<1>(&write_remote_characteristic_success_callback_),
867 SaveArg<2>(&write_remote_characteristic_error_callback_)));
868
869 connection->SendMessage(base::WrapUnique(new FakeWireMessage(kSmallMessage)));
870
871 for (int i = 0; i < kMaxNumberOfTries; i++) {
872 EXPECT_EQ(last_value_written_on_tx_characteristic_, kSmallPackets0);
873 ASSERT_FALSE(write_remote_characteristic_error_callback_.is_null());
874 EXPECT_FALSE(write_remote_characteristic_success_callback_.is_null());
875 write_remote_characteristic_error_callback_.Run(
876 device::BluetoothRemoteGattService::GATT_ERROR_UNKNOWN);
877 if (i == kMaxNumberOfTries - 1) {
878 EXPECT_EQ(1, connection_observer_.GetNumSendCompleted());
879 EXPECT_EQ(kSmallMessage,
880 connection_observer_.GetLastDeserializedMessage());
881 EXPECT_EQ(false, connection_observer_.GetLastSendSuccess());
882 } else {
883 EXPECT_EQ(0, connection_observer_.GetNumSendCompleted());
884 }
885 }
886
887 EXPECT_EQ(connection->sub_status(), SubStatus::DISCONNECTED);
888 EXPECT_EQ(connection->status(), Connection::DISCONNECTED);
889 }
890
891 TEST_F(ProximityAuthBluetoothLowEnergyWeaveClientConnectionTest,
892 ReceiveCloseConnectionTest) {
893 std::unique_ptr<TestBluetoothLowEnergyWeaveClientConnection> connection(
894 CreateConnection());
895 InitializeConnection(connection.get(), kDefaultMaxPacketSize);
896
897 connection->GattCharacteristicValueChanged(
898 adapter_.get(), rx_characteristic_.get(), kConnectionCloseUnknownError);
899
900 EXPECT_EQ(receiver_factory_.GetMostRecentInstance()->GetReasonForClose(),
901 ReasonForClose::UNKNOWN_ERROR);
902 EXPECT_EQ(connection->sub_status(), SubStatus::DISCONNECTED);
903 EXPECT_EQ(connection->status(), Connection::DISCONNECTED);
904 }
905
906 TEST_F(ProximityAuthBluetoothLowEnergyWeaveClientConnectionTest,
907 ReceiverErrorTest) {
908 std::unique_ptr<TestBluetoothLowEnergyWeaveClientConnection> connection(
909 CreateConnection());
910
911 InitializeConnection(connection.get(), kDefaultMaxPacketSize);
912
913 EXPECT_CALL(*tx_characteristic_, WriteRemoteCharacteristic(_, _, _))
914 .WillOnce(
915 DoAll(SaveArg<0>(&last_value_written_on_tx_characteristic_),
916 SaveArg<1>(&write_remote_characteristic_success_callback_),
917 SaveArg<2>(&write_remote_characteristic_error_callback_)));
918
919 connection->GattCharacteristicValueChanged(
920 adapter_.get(), rx_characteristic_.get(), kErroneousPacket);
921
922 EXPECT_EQ(last_value_written_on_tx_characteristic_,
923 kConnectionCloseApplicationError);
924 EXPECT_EQ(receiver_factory_.GetMostRecentInstance()->GetReasonToClose(),
925 ReasonForClose::APPLICATION_ERROR);
926
927 RunWriteCharacteristicSuccessCallback();
928 EXPECT_EQ(connection->sub_status(), SubStatus::DISCONNECTED);
929 EXPECT_EQ(connection->status(), Connection::DISCONNECTED);
930 }
931
932 TEST_F(ProximityAuthBluetoothLowEnergyWeaveClientConnectionTest,
933 ReceiverErrorWithPendingWritesTest) {
934 std::unique_ptr<TestBluetoothLowEnergyWeaveClientConnection> connection(
935 CreateConnection());
936
937 InitializeConnection(connection.get(), kLargeMaxPacketSize);
938
939 EXPECT_CALL(*tx_characteristic_, WriteRemoteCharacteristic(_, _, _))
940 .WillOnce(
941 DoAll(SaveArg<0>(&last_value_written_on_tx_characteristic_),
942 SaveArg<1>(&write_remote_characteristic_success_callback_),
943 SaveArg<2>(&write_remote_characteristic_error_callback_)));
944
945 connection->SendMessage(base::WrapUnique(new FakeWireMessage(kLargeMessage)));
946
947 connection->GattCharacteristicValueChanged(
948 adapter_.get(), rx_characteristic_.get(), kErroneousPacket);
949
950 EXPECT_EQ(last_value_written_on_tx_characteristic_, kLargePackets0);
951
952 EXPECT_CALL(*tx_characteristic_, WriteRemoteCharacteristic(_, _, _))
953 .WillOnce(
954 DoAll(SaveArg<0>(&last_value_written_on_tx_characteristic_),
955 SaveArg<1>(&write_remote_characteristic_success_callback_),
956 SaveArg<2>(&write_remote_characteristic_error_callback_)));
957
958 RunWriteCharacteristicSuccessCallback();
959
960 EXPECT_EQ(last_value_written_on_tx_characteristic_,
961 kConnectionCloseApplicationError);
962 EXPECT_EQ(receiver_factory_.GetMostRecentInstance()->GetReasonToClose(),
963 ReasonForClose::APPLICATION_ERROR);
964
965 RunWriteCharacteristicSuccessCallback();
966 EXPECT_EQ(connection->sub_status(), SubStatus::DISCONNECTED);
967 EXPECT_EQ(connection->status(), Connection::DISCONNECTED);
968 }
969
970 TEST_F(ProximityAuthBluetoothLowEnergyWeaveClientConnectionTest,
971 WriteConnectionCloseMaxNumberOfTimes) {
972 std::unique_ptr<TestBluetoothLowEnergyWeaveClientConnection> connection(
973 CreateConnection());
974
975 InitializeConnection(connection.get(), kDefaultMaxPacketSize);
976 EXPECT_EQ(connection->sub_status(), SubStatus::CONNECTED);
977
978 EXPECT_CALL(*tx_characteristic_, WriteRemoteCharacteristic(_, _, _))
979 .WillOnce(
980 DoAll(SaveArg<0>(&last_value_written_on_tx_characteristic_),
981 SaveArg<1>(&write_remote_characteristic_success_callback_),
982 SaveArg<2>(&write_remote_characteristic_error_callback_)));
983 connection->Disconnect();
984 EXPECT_EQ(connection->sub_status(), SubStatus::CONNECTED);
985
986 for (int i = 0; i < kMaxNumberOfTries; i++) {
987 EXPECT_EQ(last_value_written_on_tx_characteristic_,
988 kConnectionCloseSuccess);
989 ASSERT_FALSE(write_remote_characteristic_error_callback_.is_null());
990 EXPECT_FALSE(write_remote_characteristic_success_callback_.is_null());
991
992 if (i != kMaxNumberOfTries - 1) {
993 EXPECT_CALL(*tx_characteristic_, WriteRemoteCharacteristic(_, _, _))
994 .WillOnce(
995 DoAll(SaveArg<0>(&last_value_written_on_tx_characteristic_),
996 SaveArg<1>(&write_remote_characteristic_success_callback_),
997 SaveArg<2>(&write_remote_characteristic_error_callback_)));
998 }
999
1000 write_remote_characteristic_error_callback_.Run(
1001 device::BluetoothRemoteGattService::GATT_ERROR_UNKNOWN);
1002 }
1003
1004 EXPECT_EQ(connection->sub_status(), SubStatus::DISCONNECTED);
1005 EXPECT_EQ(connection->status(), Connection::DISCONNECTED);
1006 }
1007
1008 TEST_F(ProximityAuthBluetoothLowEnergyWeaveClientConnectionTest,
1009 ConnectAfterADelayWhenThrottled) {
1010 std::unique_ptr<TestBluetoothLowEnergyWeaveClientConnection> connection(
1011 CreateConnection());
1012
1013 EXPECT_CALL(*bluetooth_throttler_, GetDelay())
1014 .WillOnce(Return(base::TimeDelta(base::TimeDelta::FromSeconds(1))));
1015 EXPECT_CALL(*device_, CreateGattConnection(_, _))
1016 .WillOnce(DoAll(SaveArg<0>(&create_gatt_connection_success_callback_),
1017 SaveArg<1>(&create_gatt_connection_error_callback_)));
1018
1019 // No GATT connection should be created before the delay.
1020 connection->Connect();
1021 EXPECT_EQ(connection->sub_status(), SubStatus::WAITING_GATT_CONNECTION);
1022 EXPECT_EQ(connection->status(), Connection::IN_PROGRESS);
1023 EXPECT_TRUE(create_gatt_connection_error_callback_.is_null());
1024 EXPECT_TRUE(create_gatt_connection_success_callback_.is_null());
1025
1026 // A GATT connection should be created after the delay.
1027 task_runner_->RunUntilIdle();
1028 EXPECT_FALSE(create_gatt_connection_error_callback_.is_null());
1029 ASSERT_FALSE(create_gatt_connection_success_callback_.is_null());
1030
1031 // Preparing |connection| to run |create_gatt_connection_success_callback_|.
1032 EXPECT_CALL(*connection, CreateCharacteristicsFinder(_, _))
1033 .WillOnce(DoAll(
1034 SaveArg<0>(&characteristics_finder_success_callback_),
1035 SaveArg<1>(&characteristics_finder_error_callback_),
1036 Return(new NiceMock<MockBluetoothLowEnergyCharacteristicsFinder>)));
1037
1038 create_gatt_connection_success_callback_.Run(
1039 base::WrapUnique(new NiceMock<device::MockBluetoothGattConnection>(
1040 adapter_, kTestRemoteDeviceBluetoothAddress)));
1041
1042 CharacteristicsFound(connection.get());
1043 NotifySessionStarted(connection.get());
1044 ConnectionResponseReceived(connection.get(), kDefaultMaxPacketSize);
1045 }
1046
1047 } // namespace weave
1048
1049 } // namespace proximity_auth
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698