Commit 05a1565a authored by Kyle Horimoto's avatar Kyle Horimoto Committed by Commit Bot

[CrOS PhoneHub] Handle pending Nearby connection requests

This CL implements a TODO in PendingConnectionManagerImpl to handle
incoming requests for connections via the Nearby Connections library.
When a request is received, we create a NearbyInitiatorConnectionAttempt
(if one does not already exist), then add a new
PendingNearbyInitiatorConnectionRequest to it.

Additionally, this CL updates the initialization flow for the
SecureChannel service so that it now creates an instance of
NearbyConnectionManager.

Bug: 1106937
Change-Id: Ibe56476babfb201b748beed1fefc80efda7e304e
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2419374
Commit-Queue: Kyle Horimoto <khorimoto@chromium.org>
Reviewed-by: default avatarJames Vecore <vecore@google.com>
Cr-Commit-Position: refs/heads/master@{#809534}
parent da6b36bc
...@@ -10,8 +10,10 @@ ...@@ -10,8 +10,10 @@
#include "chromeos/services/secure_channel/authenticated_channel.h" #include "chromeos/services/secure_channel/authenticated_channel.h"
#include "chromeos/services/secure_channel/ble_initiator_connection_attempt.h" #include "chromeos/services/secure_channel/ble_initiator_connection_attempt.h"
#include "chromeos/services/secure_channel/ble_listener_connection_attempt.h" #include "chromeos/services/secure_channel/ble_listener_connection_attempt.h"
#include "chromeos/services/secure_channel/nearby_initiator_connection_attempt.h"
#include "chromeos/services/secure_channel/pending_ble_initiator_connection_request.h" #include "chromeos/services/secure_channel/pending_ble_initiator_connection_request.h"
#include "chromeos/services/secure_channel/pending_ble_listener_connection_request.h" #include "chromeos/services/secure_channel/pending_ble_listener_connection_request.h"
#include "chromeos/services/secure_channel/pending_nearby_initiator_connection_request.h"
namespace chromeos { namespace chromeos {
...@@ -26,14 +28,17 @@ std::unique_ptr<PendingConnectionManager> ...@@ -26,14 +28,17 @@ std::unique_ptr<PendingConnectionManager>
PendingConnectionManagerImpl::Factory::Create( PendingConnectionManagerImpl::Factory::Create(
Delegate* delegate, Delegate* delegate,
BleConnectionManager* ble_connection_manager, BleConnectionManager* ble_connection_manager,
NearbyConnectionManager* nearby_connection_manager,
scoped_refptr<device::BluetoothAdapter> bluetooth_adapter) { scoped_refptr<device::BluetoothAdapter> bluetooth_adapter) {
if (test_factory_) { if (test_factory_) {
return test_factory_->CreateInstance(delegate, ble_connection_manager, return test_factory_->CreateInstance(delegate, ble_connection_manager,
nearby_connection_manager,
bluetooth_adapter); bluetooth_adapter);
} }
return base::WrapUnique(new PendingConnectionManagerImpl( return base::WrapUnique(new PendingConnectionManagerImpl(
delegate, ble_connection_manager, bluetooth_adapter)); delegate, ble_connection_manager, nearby_connection_manager,
bluetooth_adapter));
} }
// static // static
...@@ -47,9 +52,11 @@ PendingConnectionManagerImpl::Factory::~Factory() = default; ...@@ -47,9 +52,11 @@ PendingConnectionManagerImpl::Factory::~Factory() = default;
PendingConnectionManagerImpl::PendingConnectionManagerImpl( PendingConnectionManagerImpl::PendingConnectionManagerImpl(
Delegate* delegate, Delegate* delegate,
BleConnectionManager* ble_connection_manager, BleConnectionManager* ble_connection_manager,
NearbyConnectionManager* nearby_connection_manager,
scoped_refptr<device::BluetoothAdapter> bluetooth_adapter) scoped_refptr<device::BluetoothAdapter> bluetooth_adapter)
: PendingConnectionManager(delegate), : PendingConnectionManager(delegate),
ble_connection_manager_(ble_connection_manager), ble_connection_manager_(ble_connection_manager),
nearby_connection_manager_(nearby_connection_manager),
bluetooth_adapter_(bluetooth_adapter) {} bluetooth_adapter_(bluetooth_adapter) {}
PendingConnectionManagerImpl::~PendingConnectionManagerImpl() = default; PendingConnectionManagerImpl::~PendingConnectionManagerImpl() = default;
...@@ -114,22 +121,8 @@ void PendingConnectionManagerImpl::OnConnectionAttemptSucceeded( ...@@ -114,22 +121,8 @@ void PendingConnectionManagerImpl::OnConnectionAttemptSucceeded(
// connection attempt, add them to |all_clients|, and remove the associated // connection attempt, add them to |all_clients|, and remove the associated
// map entries. // map entries.
for (const auto& connection_attempt_details : to_process) { for (const auto& connection_attempt_details : to_process) {
std::vector<std::unique_ptr<ClientConnectionParameters>> clients_in_loop; std::vector<std::unique_ptr<ClientConnectionParameters>> clients_in_loop =
ExtractClientConnectionParameters(connection_attempt_details);
switch (connection_attempt_details.connection_role()) {
case ConnectionRole::kInitiatorRole:
clients_in_loop = ConnectionAttempt<BleInitiatorFailureType>::
ExtractClientConnectionParameters(
std::move(id_pair_to_ble_initiator_connection_attempts_
[connection_attempt_details.device_id_pair()]));
break;
case ConnectionRole::kListenerRole:
clients_in_loop = ConnectionAttempt<BleListenerFailureType>::
ExtractClientConnectionParameters(
std::move(id_pair_to_ble_listener_connection_attempts_
[connection_attempt_details.device_id_pair()]));
break;
}
// Move elements in |clients_in_list| to |all_clients|. // Move elements in |clients_in_list| to |all_clients|.
all_clients.insert(all_clients.end(), all_clients.insert(all_clients.end(),
...@@ -238,7 +231,9 @@ void PendingConnectionManagerImpl::HandleNearbyRequest( ...@@ -238,7 +231,9 @@ void PendingConnectionManagerImpl::HandleNearbyRequest(
ConnectionPriority connection_priority) { ConnectionPriority connection_priority) {
switch (connection_attempt_details.connection_role()) { switch (connection_attempt_details.connection_role()) {
case ConnectionRole::kInitiatorRole: case ConnectionRole::kInitiatorRole:
// TODO(khorimoto): Attempt Nearby Connection. HandleNearbyInitiatorRequest(connection_attempt_details,
std::move(client_connection_parameters),
connection_priority);
break; break;
case ConnectionRole::kListenerRole: case ConnectionRole::kListenerRole:
NOTREACHED() NOTREACHED()
...@@ -248,62 +243,165 @@ void PendingConnectionManagerImpl::HandleNearbyRequest( ...@@ -248,62 +243,165 @@ void PendingConnectionManagerImpl::HandleNearbyRequest(
} }
} }
void PendingConnectionManagerImpl::HandleNearbyInitiatorRequest(
const ConnectionAttemptDetails& connection_attempt_details,
std::unique_ptr<ClientConnectionParameters> client_connection_parameters,
ConnectionPriority connection_priority) {
// If no ConnectionAttempt exists to this device in the initiator role, create
// one.
if (!base::Contains(id_pair_to_nearby_initiator_connection_attempts_,
connection_attempt_details.device_id_pair())) {
id_pair_to_nearby_initiator_connection_attempts_[connection_attempt_details
.device_id_pair()] =
NearbyInitiatorConnectionAttempt::Factory::Create(
nearby_connection_manager_, this /* delegate */,
connection_attempt_details);
}
auto& connection_attempt = id_pair_to_nearby_initiator_connection_attempts_
[connection_attempt_details.device_id_pair()];
bool success = connection_attempt->AddPendingConnectionRequest(
PendingNearbyInitiatorConnectionRequest::Factory::Create(
std::move(client_connection_parameters), connection_priority,
connection_attempt.get() /* delegate */, bluetooth_adapter_));
if (!success) {
PA_LOG(ERROR)
<< "PendingConnectionManagerImpl::"
<< "HandleNearbyInitiatorRequest(): Not able to handle request. "
<< "Details: " << connection_attempt_details
<< ", Client parameters: " << *client_connection_parameters;
NOTREACHED();
}
}
std::vector<std::unique_ptr<ClientConnectionParameters>>
PendingConnectionManagerImpl::ExtractClientConnectionParameters(
const ConnectionAttemptDetails& connection_attempt_details) {
switch (connection_attempt_details.connection_medium()) {
case ConnectionMedium::kBluetoothLowEnergy:
switch (connection_attempt_details.connection_role()) {
// BLE initiator:
case ConnectionRole::kInitiatorRole:
return ConnectionAttempt<BleInitiatorFailureType>::
ExtractClientConnectionParameters(
std::move(id_pair_to_ble_initiator_connection_attempts_
[connection_attempt_details.device_id_pair()]));
// BLE listener:
case ConnectionRole::kListenerRole:
return ConnectionAttempt<BleListenerFailureType>::
ExtractClientConnectionParameters(
std::move(id_pair_to_ble_listener_connection_attempts_
[connection_attempt_details.device_id_pair()]));
}
case ConnectionMedium::kNearbyConnections:
switch (connection_attempt_details.connection_role()) {
// Nearby initiator:
case ConnectionRole::kInitiatorRole:
return ConnectionAttempt<NearbyInitiatorFailureType>::
ExtractClientConnectionParameters(
std::move(id_pair_to_nearby_initiator_connection_attempts_
[connection_attempt_details.device_id_pair()]));
// Nearby listener:
case ConnectionRole::kListenerRole:
NOTREACHED() << "Nearby listener connections are not implemented.";
return std::vector<std::unique_ptr<ClientConnectionParameters>>();
}
}
}
void PendingConnectionManagerImpl::RemoveMapEntriesForFinishedConnectionAttempt( void PendingConnectionManagerImpl::RemoveMapEntriesForFinishedConnectionAttempt(
const ConnectionAttemptDetails& connection_attempt_details) { const ConnectionAttemptDetails& connection_attempt_details) {
// Make a copy of |connection_attempt_details|, since it belongs to the // Make a copy of |connection_attempt_details|, since it belongs to the
// ConnectionAttempt which is about to be deleted below. // ConnectionAttempt which is about to be deleted below.
ConnectionAttemptDetails connection_attempt_details_copy = ConnectionAttemptDetails connection_attempt_details_copy =
connection_attempt_details; connection_attempt_details;
ConnectionDetails connection_details =
connection_attempt_details_copy.GetAssociatedConnectionDetails();
switch (connection_attempt_details_copy.connection_role()) { RemoveIdPairToConnectionAttemptMapEntriesForFinishedConnectionAttempt(
case ConnectionRole::kInitiatorRole: { connection_attempt_details_copy);
size_t num_deleted = id_pair_to_ble_initiator_connection_attempts_.erase(
connection_attempt_details_copy.device_id_pair()); size_t num_deleted =
details_to_attempt_details_map_[connection_details].erase(
connection_attempt_details_copy);
if (num_deleted != 1u) { if (num_deleted != 1u) {
PA_LOG(ERROR) << "PendingConnectionManagerImpl::" PA_LOG(ERROR) << "PendingConnectionManagerImpl::"
<< "RemoveMapEntriesForFinishedConnectionAttempt(): " << "RemoveMapEntriesForFinishedConnectionAttempt(): "
<< "Tried to remove failed initiator ConnectionAttempt, " << "Tried to remove ConnectionAttemptDetails, but they were"
<< "but it was not present in the map. Details: " << "not present in the map. Details: "
<< connection_attempt_details_copy; << connection_attempt_details_copy;
NOTREACHED(); NOTREACHED();
} }
// If |connection_attempt_details_copy| was the last entry, remove the entire
// set.
if (details_to_attempt_details_map_[connection_details].empty())
details_to_attempt_details_map_.erase(connection_details);
}
void PendingConnectionManagerImpl::
RemoveIdPairToConnectionAttemptMapEntriesForFinishedConnectionAttempt(
const ConnectionAttemptDetails& connection_attempt_details) {
switch (connection_attempt_details.connection_medium()) {
case ConnectionMedium::kBluetoothLowEnergy:
switch (connection_attempt_details.connection_role()) {
// BLE initiator.
case ConnectionRole::kInitiatorRole: {
size_t num_deleted =
id_pair_to_ble_initiator_connection_attempts_.erase(
connection_attempt_details.device_id_pair());
if (num_deleted != 1u) {
PA_LOG(ERROR) << "Tried to remove failed BLE initiator "
<< "ConnectionAttempt, but it was not present in the "
<< "map. Details: " << connection_attempt_details;
NOTREACHED();
}
break; break;
} }
// BLE listener.
case ConnectionRole::kListenerRole: { case ConnectionRole::kListenerRole: {
size_t num_deleted = id_pair_to_ble_listener_connection_attempts_.erase( size_t num_deleted =
connection_attempt_details_copy.device_id_pair()); id_pair_to_ble_listener_connection_attempts_.erase(
connection_attempt_details.device_id_pair());
if (num_deleted != 1u) { if (num_deleted != 1u) {
PA_LOG(ERROR) << "PendingConnectionManagerImpl::" PA_LOG(ERROR) << "Tried to remove failed BLE listener "
<< "RemoveMapEntriesForFinishedConnectionAttempt(): " << "ConnectionAttempt, but it was not present in the "
<< "Tried to remove failed listener ConnectionAttempt, " << "map. Details: " << connection_attempt_details;
<< "but it was not present in the map. Details: "
<< connection_attempt_details_copy;
NOTREACHED(); NOTREACHED();
} }
break; break;
} }
} }
break;
ConnectionDetails connection_details = case ConnectionMedium::kNearbyConnections:
connection_attempt_details_copy.GetAssociatedConnectionDetails(); switch (connection_attempt_details.connection_role()) {
// Nearby initiator.
case ConnectionRole::kInitiatorRole: {
size_t num_deleted = size_t num_deleted =
details_to_attempt_details_map_[connection_details].erase( id_pair_to_nearby_initiator_connection_attempts_.erase(
connection_attempt_details_copy); connection_attempt_details.device_id_pair());
if (num_deleted != 1u) { if (num_deleted != 1u) {
PA_LOG(ERROR) << "PendingConnectionManagerImpl::" PA_LOG(ERROR) << "Tried to remove failed Nearby initiator "
<< "RemoveMapEntriesForFinishedConnectionAttempt(): " << "ConnectionAttempt, but it was not present in the "
<< "Tried to remove ConnectionAttemptDetails, but they were" << "map. Details: " << connection_attempt_details;
<< "not present in the map. Details: "
<< connection_attempt_details_copy;
NOTREACHED(); NOTREACHED();
} }
break;
}
// If |connection_attempt_details_copy| was the last entry, remove the entire case ConnectionRole::kListenerRole:
// set. NOTREACHED();
if (details_to_attempt_details_map_[connection_details].empty()) break;
details_to_attempt_details_map_.erase(connection_details); }
break;
}
} }
} // namespace secure_channel } // namespace secure_channel
......
...@@ -18,6 +18,7 @@ ...@@ -18,6 +18,7 @@
#include "chromeos/services/secure_channel/connection_attempt_delegate.h" #include "chromeos/services/secure_channel/connection_attempt_delegate.h"
#include "chromeos/services/secure_channel/connection_role.h" #include "chromeos/services/secure_channel/connection_role.h"
#include "chromeos/services/secure_channel/device_id_pair.h" #include "chromeos/services/secure_channel/device_id_pair.h"
#include "chromeos/services/secure_channel/nearby_initiator_failure_type.h"
#include "chromeos/services/secure_channel/pending_connection_manager.h" #include "chromeos/services/secure_channel/pending_connection_manager.h"
#include "chromeos/services/secure_channel/public/cpp/shared/connection_medium.h" #include "chromeos/services/secure_channel/public/cpp/shared/connection_medium.h"
#include "chromeos/services/secure_channel/public/cpp/shared/connection_priority.h" #include "chromeos/services/secure_channel/public/cpp/shared/connection_priority.h"
...@@ -28,6 +29,7 @@ namespace chromeos { ...@@ -28,6 +29,7 @@ namespace chromeos {
namespace secure_channel { namespace secure_channel {
class BleConnectionManager; class BleConnectionManager;
class NearbyConnectionManager;
// Concrete PendingConnectionManager implementation. This class creates one // Concrete PendingConnectionManager implementation. This class creates one
// ConnectionAttempt per ConnectionAttemptDetails requested; if more than one // ConnectionAttempt per ConnectionAttemptDetails requested; if more than one
...@@ -45,6 +47,7 @@ class PendingConnectionManagerImpl : public PendingConnectionManager, ...@@ -45,6 +47,7 @@ class PendingConnectionManagerImpl : public PendingConnectionManager,
static std::unique_ptr<PendingConnectionManager> Create( static std::unique_ptr<PendingConnectionManager> Create(
Delegate* delegate, Delegate* delegate,
BleConnectionManager* ble_connection_manager, BleConnectionManager* ble_connection_manager,
NearbyConnectionManager* nearby_connection_manager,
scoped_refptr<device::BluetoothAdapter> bluetooth_adapter); scoped_refptr<device::BluetoothAdapter> bluetooth_adapter);
static void SetFactoryForTesting(Factory* test_factory); static void SetFactoryForTesting(Factory* test_factory);
...@@ -53,6 +56,7 @@ class PendingConnectionManagerImpl : public PendingConnectionManager, ...@@ -53,6 +56,7 @@ class PendingConnectionManagerImpl : public PendingConnectionManager,
virtual std::unique_ptr<PendingConnectionManager> CreateInstance( virtual std::unique_ptr<PendingConnectionManager> CreateInstance(
Delegate* delegate, Delegate* delegate,
BleConnectionManager* ble_connection_manager, BleConnectionManager* ble_connection_manager,
NearbyConnectionManager* nearby_connection_manager,
scoped_refptr<device::BluetoothAdapter> bluetooth_adapter) = 0; scoped_refptr<device::BluetoothAdapter> bluetooth_adapter) = 0;
private: private:
...@@ -65,6 +69,7 @@ class PendingConnectionManagerImpl : public PendingConnectionManager, ...@@ -65,6 +69,7 @@ class PendingConnectionManagerImpl : public PendingConnectionManager,
PendingConnectionManagerImpl( PendingConnectionManagerImpl(
Delegate* delegate, Delegate* delegate,
BleConnectionManager* ble_connection_manager, BleConnectionManager* ble_connection_manager,
NearbyConnectionManager* nearby_connection_manager,
scoped_refptr<device::BluetoothAdapter> bluetooth_adapter); scoped_refptr<device::BluetoothAdapter> bluetooth_adapter);
// PendingConnectionManager: // PendingConnectionManager:
...@@ -97,9 +102,29 @@ class PendingConnectionManagerImpl : public PendingConnectionManager, ...@@ -97,9 +102,29 @@ class PendingConnectionManagerImpl : public PendingConnectionManager,
const ConnectionAttemptDetails& connection_attempt_details, const ConnectionAttemptDetails& connection_attempt_details,
std::unique_ptr<ClientConnectionParameters> client_connection_parameters, std::unique_ptr<ClientConnectionParameters> client_connection_parameters,
ConnectionPriority connection_priority); ConnectionPriority connection_priority);
void HandleNearbyInitiatorRequest(
const ConnectionAttemptDetails& connection_attempt_details,
std::unique_ptr<ClientConnectionParameters> client_connection_parameters,
ConnectionPriority connection_priority);
// Retrieves ClientConnectionParameters for a given connection attempt.
// Because a single connection attempt may have multiple client requests
// (e.g., when multiple clients requets a connection at the same time), this
// function returns a vector.
//
// Note that this function std::move()s results from the |id_pair_to_*_| maps
// below, so these maps will end up having "empty" values after the function
// is called. This function is expected to be used in conjunction with
// RemoveMapEntriesForFinishedConnectionAttempt(), which cleans up those empty
// values.
std::vector<std::unique_ptr<ClientConnectionParameters>>
ExtractClientConnectionParameters(
const ConnectionAttemptDetails& connection_attempt_details);
void RemoveMapEntriesForFinishedConnectionAttempt( void RemoveMapEntriesForFinishedConnectionAttempt(
const ConnectionAttemptDetails& connection_attempt_details); const ConnectionAttemptDetails& connection_attempt_details);
void RemoveIdPairToConnectionAttemptMapEntriesForFinishedConnectionAttempt(
const ConnectionAttemptDetails& connection_attempt_details);
base::flat_map<DeviceIdPair, base::flat_map<DeviceIdPair,
std::unique_ptr<ConnectionAttempt<BleInitiatorFailureType>>> std::unique_ptr<ConnectionAttempt<BleInitiatorFailureType>>>
...@@ -109,10 +134,15 @@ class PendingConnectionManagerImpl : public PendingConnectionManager, ...@@ -109,10 +134,15 @@ class PendingConnectionManagerImpl : public PendingConnectionManager,
std::unique_ptr<ConnectionAttempt<BleListenerFailureType>>> std::unique_ptr<ConnectionAttempt<BleListenerFailureType>>>
id_pair_to_ble_listener_connection_attempts_; id_pair_to_ble_listener_connection_attempts_;
base::flat_map<DeviceIdPair,
std::unique_ptr<ConnectionAttempt<NearbyInitiatorFailureType>>>
id_pair_to_nearby_initiator_connection_attempts_;
base::flat_map<ConnectionDetails, base::flat_set<ConnectionAttemptDetails>> base::flat_map<ConnectionDetails, base::flat_set<ConnectionAttemptDetails>>
details_to_attempt_details_map_; details_to_attempt_details_map_;
BleConnectionManager* ble_connection_manager_; BleConnectionManager* ble_connection_manager_;
NearbyConnectionManager* nearby_connection_manager_;
scoped_refptr<device::BluetoothAdapter> bluetooth_adapter_; scoped_refptr<device::BluetoothAdapter> bluetooth_adapter_;
DISALLOW_COPY_AND_ASSIGN(PendingConnectionManagerImpl); DISALLOW_COPY_AND_ASSIGN(PendingConnectionManagerImpl);
......
...@@ -18,10 +18,13 @@ ...@@ -18,10 +18,13 @@
#include "chromeos/services/secure_channel/fake_ble_connection_manager.h" #include "chromeos/services/secure_channel/fake_ble_connection_manager.h"
#include "chromeos/services/secure_channel/fake_client_connection_parameters.h" #include "chromeos/services/secure_channel/fake_client_connection_parameters.h"
#include "chromeos/services/secure_channel/fake_connection_attempt.h" #include "chromeos/services/secure_channel/fake_connection_attempt.h"
#include "chromeos/services/secure_channel/fake_nearby_connection_manager.h"
#include "chromeos/services/secure_channel/fake_pending_connection_manager.h" #include "chromeos/services/secure_channel/fake_pending_connection_manager.h"
#include "chromeos/services/secure_channel/fake_pending_connection_request.h" #include "chromeos/services/secure_channel/fake_pending_connection_request.h"
#include "chromeos/services/secure_channel/nearby_initiator_connection_attempt.h"
#include "chromeos/services/secure_channel/pending_ble_initiator_connection_request.h" #include "chromeos/services/secure_channel/pending_ble_initiator_connection_request.h"
#include "chromeos/services/secure_channel/pending_ble_listener_connection_request.h" #include "chromeos/services/secure_channel/pending_ble_listener_connection_request.h"
#include "chromeos/services/secure_channel/pending_nearby_initiator_connection_request.h"
#include "device/bluetooth/test/mock_bluetooth_adapter.h" #include "device/bluetooth/test/mock_bluetooth_adapter.h"
#include "testing/gtest/include/gtest/gtest.h" #include "testing/gtest/include/gtest/gtest.h"
...@@ -187,6 +190,84 @@ class FakeBleListenerConnectionAttemptFactory ...@@ -187,6 +190,84 @@ class FakeBleListenerConnectionAttemptFactory
DISALLOW_COPY_AND_ASSIGN(FakeBleListenerConnectionAttemptFactory); DISALLOW_COPY_AND_ASSIGN(FakeBleListenerConnectionAttemptFactory);
}; };
class FakeNearbyInitiatorConnectionAttemptFactory
: public NearbyInitiatorConnectionAttempt::Factory {
public:
FakeNearbyInitiatorConnectionAttemptFactory(
FakeNearbyConnectionManager* expected_nearby_connection_manager)
: expected_nearby_connection_manager_(
expected_nearby_connection_manager) {}
~FakeNearbyInitiatorConnectionAttemptFactory() override = default;
void set_expected_connection_attempt_details(
const ConnectionAttemptDetails& expected_connection_attempt_details) {
expected_connection_attempt_details_ = expected_connection_attempt_details;
}
base::flat_map<ConnectionAttemptDetails,
FakeConnectionAttempt<NearbyInitiatorFailureType>*>&
details_to_active_attempt_map() {
return details_to_active_attempt_map_;
}
size_t num_instances_created() const { return num_instances_created_; }
size_t num_instances_deleted() const { return num_instances_deleted_; }
FakeConnectionAttempt<NearbyInitiatorFailureType>* last_created_instance() {
return last_created_instance_;
}
private:
// NearbyInitiatorConnectionAttempt::Factory:
std::unique_ptr<ConnectionAttempt<NearbyInitiatorFailureType>> CreateInstance(
NearbyConnectionManager* nearby_connection_manager,
ConnectionAttemptDelegate* delegate,
const ConnectionAttemptDetails& connection_attempt_details) override {
EXPECT_EQ(ConnectionRole::kInitiatorRole,
connection_attempt_details.connection_role());
EXPECT_EQ(expected_nearby_connection_manager_, nearby_connection_manager);
EXPECT_EQ(*expected_connection_attempt_details_,
connection_attempt_details);
auto instance =
std::make_unique<FakeConnectionAttempt<NearbyInitiatorFailureType>>(
delegate, connection_attempt_details,
base::BindOnce(
&FakeNearbyInitiatorConnectionAttemptFactory::OnAttemptDeleted,
base::Unretained(this), connection_attempt_details));
++num_instances_created_;
last_created_instance_ = instance.get();
details_to_active_attempt_map_[connection_attempt_details] =
last_created_instance_;
return instance;
}
void OnAttemptDeleted(
const ConnectionAttemptDetails& connection_attempt_details) {
size_t num_erased =
details_to_active_attempt_map_.erase(connection_attempt_details);
EXPECT_EQ(1u, num_erased);
++num_instances_deleted_;
}
FakeNearbyConnectionManager* expected_nearby_connection_manager_;
base::Optional<ConnectionAttemptDetails> expected_connection_attempt_details_;
base::flat_map<ConnectionAttemptDetails,
FakeConnectionAttempt<NearbyInitiatorFailureType>*>
details_to_active_attempt_map_;
size_t num_instances_created_ = 0u;
size_t num_instances_deleted_ = 0u;
FakeConnectionAttempt<NearbyInitiatorFailureType>* last_created_instance_ =
nullptr;
DISALLOW_COPY_AND_ASSIGN(FakeNearbyInitiatorConnectionAttemptFactory);
};
class FakePendingBleInitiatorConnectionRequestFactory class FakePendingBleInitiatorConnectionRequestFactory
: public PendingBleInitiatorConnectionRequest::Factory { : public PendingBleInitiatorConnectionRequest::Factory {
public: public:
...@@ -281,6 +362,53 @@ class FakePendingBleListenerConnectionRequestFactory ...@@ -281,6 +362,53 @@ class FakePendingBleListenerConnectionRequestFactory
DISALLOW_COPY_AND_ASSIGN(FakePendingBleListenerConnectionRequestFactory); DISALLOW_COPY_AND_ASSIGN(FakePendingBleListenerConnectionRequestFactory);
}; };
class FakePendingNearbyInitiatorConnectionRequestFactory
: public PendingNearbyInitiatorConnectionRequest::Factory {
public:
FakePendingNearbyInitiatorConnectionRequestFactory() = default;
~FakePendingNearbyInitiatorConnectionRequestFactory() override = default;
void SetExpectationsForNextCall(
ClientConnectionParameters* expected_client_connection_parameters,
ConnectionPriority expected_connection_priority) {
expected_client_connection_parameters_ =
expected_client_connection_parameters;
expected_connection_priority_ = expected_connection_priority;
}
FakePendingConnectionRequest<NearbyInitiatorFailureType>*
last_created_instance() {
return last_created_instance_;
}
private:
// PendingNearbyInitiatorConnectionRequest::Factory:
std::unique_ptr<PendingConnectionRequest<NearbyInitiatorFailureType>>
CreateInstance(
std::unique_ptr<ClientConnectionParameters> client_connection_parameters,
ConnectionPriority connection_priority,
PendingConnectionRequestDelegate* delegate,
scoped_refptr<device::BluetoothAdapter> bluetooth_adapter) override {
EXPECT_EQ(expected_client_connection_parameters_,
client_connection_parameters.get());
EXPECT_EQ(*expected_connection_priority_, connection_priority);
auto instance = std::make_unique<
FakePendingConnectionRequest<NearbyInitiatorFailureType>>(
delegate, connection_priority);
last_created_instance_ = instance.get();
return instance;
}
ClientConnectionParameters* expected_client_connection_parameters_ = nullptr;
base::Optional<ConnectionPriority> expected_connection_priority_;
FakePendingConnectionRequest<NearbyInitiatorFailureType>*
last_created_instance_ = nullptr;
DISALLOW_COPY_AND_ASSIGN(FakePendingNearbyInitiatorConnectionRequestFactory);
};
std::vector<std::unique_ptr<ClientConnectionParameters>> std::vector<std::unique_ptr<ClientConnectionParameters>>
GenerateFakeClientParameters(size_t num_to_generate) { GenerateFakeClientParameters(size_t num_to_generate) {
std::vector<std::unique_ptr<ClientConnectionParameters>> client_parameters; std::vector<std::unique_ptr<ClientConnectionParameters>> client_parameters;
...@@ -317,6 +445,8 @@ class SecureChannelPendingConnectionManagerImplTest : public testing::Test { ...@@ -317,6 +445,8 @@ class SecureChannelPendingConnectionManagerImplTest : public testing::Test {
void SetUp() override { void SetUp() override {
fake_delegate_ = std::make_unique<FakePendingConnectionManagerDelegate>(); fake_delegate_ = std::make_unique<FakePendingConnectionManagerDelegate>();
fake_ble_connection_manager_ = std::make_unique<FakeBleConnectionManager>(); fake_ble_connection_manager_ = std::make_unique<FakeBleConnectionManager>();
fake_nearby_connection_manager_ =
std::make_unique<FakeNearbyConnectionManager>();
fake_ble_initiator_connection_attempt_factory_ = fake_ble_initiator_connection_attempt_factory_ =
std::make_unique<FakeBleInitiatorConnectionAttemptFactory>( std::make_unique<FakeBleInitiatorConnectionAttemptFactory>(
...@@ -330,6 +460,12 @@ class SecureChannelPendingConnectionManagerImplTest : public testing::Test { ...@@ -330,6 +460,12 @@ class SecureChannelPendingConnectionManagerImplTest : public testing::Test {
BleListenerConnectionAttempt::Factory::SetFactoryForTesting( BleListenerConnectionAttempt::Factory::SetFactoryForTesting(
fake_ble_listener_connection_attempt_factory_.get()); fake_ble_listener_connection_attempt_factory_.get());
fake_nearby_initiator_connection_attempt_factory_ =
std::make_unique<FakeNearbyInitiatorConnectionAttemptFactory>(
fake_nearby_connection_manager_.get());
NearbyInitiatorConnectionAttempt::Factory::SetFactoryForTesting(
fake_nearby_initiator_connection_attempt_factory_.get());
fake_pending_ble_initiator_connection_request_factory_ = fake_pending_ble_initiator_connection_request_factory_ =
std::make_unique<FakePendingBleInitiatorConnectionRequestFactory>(); std::make_unique<FakePendingBleInitiatorConnectionRequestFactory>();
PendingBleInitiatorConnectionRequest::Factory::SetFactoryForTesting( PendingBleInitiatorConnectionRequest::Factory::SetFactoryForTesting(
...@@ -340,20 +476,28 @@ class SecureChannelPendingConnectionManagerImplTest : public testing::Test { ...@@ -340,20 +476,28 @@ class SecureChannelPendingConnectionManagerImplTest : public testing::Test {
PendingBleListenerConnectionRequest::Factory::SetFactoryForTesting( PendingBleListenerConnectionRequest::Factory::SetFactoryForTesting(
fake_pending_ble_listener_connection_request_factory_.get()); fake_pending_ble_listener_connection_request_factory_.get());
fake_pending_nearby_initiator_connection_request_factory_ =
std::make_unique<FakePendingNearbyInitiatorConnectionRequestFactory>();
PendingNearbyInitiatorConnectionRequest::Factory::SetFactoryForTesting(
fake_pending_nearby_initiator_connection_request_factory_.get());
mock_adapter_ = mock_adapter_ =
base::MakeRefCounted<testing::NiceMock<device::MockBluetoothAdapter>>(); base::MakeRefCounted<testing::NiceMock<device::MockBluetoothAdapter>>();
manager_ = PendingConnectionManagerImpl::Factory::Create( manager_ = PendingConnectionManagerImpl::Factory::Create(
fake_delegate_.get(), fake_ble_connection_manager_.get(), fake_delegate_.get(), fake_ble_connection_manager_.get(),
mock_adapter_); fake_nearby_connection_manager_.get(), mock_adapter_);
} }
void TearDown() override { void TearDown() override {
BleInitiatorConnectionAttempt::Factory::SetFactoryForTesting(nullptr); BleInitiatorConnectionAttempt::Factory::SetFactoryForTesting(nullptr);
BleListenerConnectionAttempt::Factory::SetFactoryForTesting(nullptr); BleListenerConnectionAttempt::Factory::SetFactoryForTesting(nullptr);
NearbyInitiatorConnectionAttempt::Factory::SetFactoryForTesting(nullptr);
PendingBleInitiatorConnectionRequest::Factory::SetFactoryForTesting( PendingBleInitiatorConnectionRequest::Factory::SetFactoryForTesting(
nullptr); nullptr);
PendingBleListenerConnectionRequest::Factory::SetFactoryForTesting(nullptr); PendingBleListenerConnectionRequest::Factory::SetFactoryForTesting(nullptr);
PendingNearbyInitiatorConnectionRequest::Factory::SetFactoryForTesting(
nullptr);
} }
void HandleCanceledRequestAndVerifyNoInstancesCreated( void HandleCanceledRequestAndVerifyNoInstancesCreated(
...@@ -365,6 +509,10 @@ class SecureChannelPendingConnectionManagerImplTest : public testing::Test { ...@@ -365,6 +509,10 @@ class SecureChannelPendingConnectionManagerImplTest : public testing::Test {
FakeConnectionAttempt< FakeConnectionAttempt<
BleListenerFailureType>* last_ble_listener_attempt_before_call = BleListenerFailureType>* last_ble_listener_attempt_before_call =
fake_ble_listener_connection_attempt_factory_->last_created_instance(); fake_ble_listener_connection_attempt_factory_->last_created_instance();
FakeConnectionAttempt<NearbyInitiatorFailureType>*
last_nearby_initiator_attempt_before_call =
fake_nearby_initiator_connection_attempt_factory_
->last_created_instance();
FakePendingConnectionRequest<BleInitiatorFailureType>* FakePendingConnectionRequest<BleInitiatorFailureType>*
last_ble_initiator_request_before_call = last_ble_initiator_request_before_call =
fake_pending_ble_initiator_connection_request_factory_ fake_pending_ble_initiator_connection_request_factory_
...@@ -373,6 +521,10 @@ class SecureChannelPendingConnectionManagerImplTest : public testing::Test { ...@@ -373,6 +521,10 @@ class SecureChannelPendingConnectionManagerImplTest : public testing::Test {
last_ble_listener_request_before_call = last_ble_listener_request_before_call =
fake_pending_ble_listener_connection_request_factory_ fake_pending_ble_listener_connection_request_factory_
->last_created_instance(); ->last_created_instance();
FakePendingConnectionRequest<NearbyInitiatorFailureType>*
last_nearby_initiator_request_before_call =
fake_pending_nearby_initiator_connection_request_factory_
->last_created_instance();
HandleConnectionRequest(connection_attempt_details, connection_priority, HandleConnectionRequest(connection_attempt_details, connection_priority,
true /* cancel_request_before_adding */); true /* cancel_request_before_adding */);
...@@ -385,12 +537,18 @@ class SecureChannelPendingConnectionManagerImplTest : public testing::Test { ...@@ -385,12 +537,18 @@ class SecureChannelPendingConnectionManagerImplTest : public testing::Test {
EXPECT_EQ( EXPECT_EQ(
last_ble_listener_attempt_before_call, last_ble_listener_attempt_before_call,
fake_ble_listener_connection_attempt_factory_->last_created_instance()); fake_ble_listener_connection_attempt_factory_->last_created_instance());
EXPECT_EQ(last_nearby_initiator_attempt_before_call,
fake_nearby_initiator_connection_attempt_factory_
->last_created_instance());
EXPECT_EQ(last_ble_initiator_request_before_call, EXPECT_EQ(last_ble_initiator_request_before_call,
fake_pending_ble_initiator_connection_request_factory_ fake_pending_ble_initiator_connection_request_factory_
->last_created_instance()); ->last_created_instance());
EXPECT_EQ(last_ble_listener_request_before_call, EXPECT_EQ(last_ble_listener_request_before_call,
fake_pending_ble_listener_connection_request_factory_ fake_pending_ble_listener_connection_request_factory_
->last_created_instance()); ->last_created_instance());
EXPECT_EQ(last_nearby_initiator_request_before_call,
fake_pending_nearby_initiator_connection_request_factory_
->last_created_instance());
} }
void HandleRequestAndVerifyHandledByConnectionAttempt( void HandleRequestAndVerifyHandledByConnectionAttempt(
...@@ -398,10 +556,12 @@ class SecureChannelPendingConnectionManagerImplTest : public testing::Test { ...@@ -398,10 +556,12 @@ class SecureChannelPendingConnectionManagerImplTest : public testing::Test {
ConnectionPriority connection_priority) { ConnectionPriority connection_priority) {
HandleConnectionRequest(connection_attempt_details, connection_priority, HandleConnectionRequest(connection_attempt_details, connection_priority,
false /* cancel_request_before_adding */); false /* cancel_request_before_adding */);
switch (connection_attempt_details.connection_medium()) {
case ConnectionMedium::kBluetoothLowEnergy:
switch (connection_attempt_details.connection_role()) { switch (connection_attempt_details.connection_role()) {
case ConnectionRole::kInitiatorRole: { case ConnectionRole::kInitiatorRole: {
FakeConnectionAttempt<BleInitiatorFailureType>* active_attempt = FakeConnectionAttempt<BleInitiatorFailureType>* active_attempt =
GetActiveInitiatorAttempt(connection_attempt_details); GetActiveBleInitiatorAttempt(connection_attempt_details);
base::UnguessableToken token_for_last_init_request = base::UnguessableToken token_for_last_init_request =
fake_pending_ble_initiator_connection_request_factory_ fake_pending_ble_initiator_connection_request_factory_
->last_created_instance() ->last_created_instance()
...@@ -413,7 +573,7 @@ class SecureChannelPendingConnectionManagerImplTest : public testing::Test { ...@@ -413,7 +573,7 @@ class SecureChannelPendingConnectionManagerImplTest : public testing::Test {
case ConnectionRole::kListenerRole: { case ConnectionRole::kListenerRole: {
FakeConnectionAttempt<BleListenerFailureType>* active_attempt = FakeConnectionAttempt<BleListenerFailureType>* active_attempt =
GetActiveListenerAttempt(connection_attempt_details); GetActiveBleListenerAttempt(connection_attempt_details);
base::UnguessableToken token_for_last_listen_request = base::UnguessableToken token_for_last_listen_request =
fake_pending_ble_listener_connection_request_factory_ fake_pending_ble_listener_connection_request_factory_
->last_created_instance() ->last_created_instance()
...@@ -423,34 +583,65 @@ class SecureChannelPendingConnectionManagerImplTest : public testing::Test { ...@@ -423,34 +583,65 @@ class SecureChannelPendingConnectionManagerImplTest : public testing::Test {
break; break;
} }
} }
break;
case ConnectionMedium::kNearbyConnections:
switch (connection_attempt_details.connection_role()) {
case ConnectionRole::kInitiatorRole: {
FakeConnectionAttempt<NearbyInitiatorFailureType>* active_attempt =
GetActiveNearbyInitiatorAttempt(connection_attempt_details);
base::UnguessableToken token_for_last_init_request =
fake_pending_nearby_initiator_connection_request_factory_
->last_created_instance()
->GetRequestId();
EXPECT_TRUE(base::Contains(active_attempt->id_to_request_map(),
token_for_last_init_request));
break;
}
case ConnectionRole::kListenerRole:
NOTREACHED();
}
break;
}
} }
void FinishInitiatorAttemptWithoutConnection( void FinishBleInitiatorAttemptWithoutConnection(
FakeConnectionAttempt<BleInitiatorFailureType>* attempt) { FakeConnectionAttempt<BleInitiatorFailureType>* attempt) {
ConnectionAttemptDetails details_for_attempt = ConnectionAttemptDetails details_for_attempt =
attempt->connection_attempt_details(); attempt->connection_attempt_details();
EXPECT_EQ(GetActiveInitiatorAttempt(details_for_attempt), attempt); EXPECT_EQ(GetActiveBleInitiatorAttempt(details_for_attempt), attempt);
attempt->OnConnectionAttemptFinishedWithoutConnection(); attempt->OnConnectionAttemptFinishedWithoutConnection();
EXPECT_FALSE(GetActiveInitiatorAttempt(details_for_attempt)); EXPECT_FALSE(GetActiveBleInitiatorAttempt(details_for_attempt));
} }
void FinishListenerAttemptWithoutConnection( void FinishBleListenerAttemptWithoutConnection(
FakeConnectionAttempt<BleListenerFailureType>* attempt) { FakeConnectionAttempt<BleListenerFailureType>* attempt) {
ConnectionAttemptDetails details_for_attempt = ConnectionAttemptDetails details_for_attempt =
attempt->connection_attempt_details(); attempt->connection_attempt_details();
EXPECT_EQ(GetActiveListenerAttempt(details_for_attempt), attempt); EXPECT_EQ(GetActiveBleListenerAttempt(details_for_attempt), attempt);
attempt->OnConnectionAttemptFinishedWithoutConnection(); attempt->OnConnectionAttemptFinishedWithoutConnection();
EXPECT_FALSE(GetActiveListenerAttempt(details_for_attempt)); EXPECT_FALSE(GetActiveBleListenerAttempt(details_for_attempt));
} }
void FinishInitiatorAttemptWithConnection( void FinishNearbyInitiatorAttemptWithoutConnection(
FakeConnectionAttempt<NearbyInitiatorFailureType>* attempt) {
ConnectionAttemptDetails details_for_attempt =
attempt->connection_attempt_details();
EXPECT_EQ(GetActiveNearbyInitiatorAttempt(details_for_attempt), attempt);
attempt->OnConnectionAttemptFinishedWithoutConnection();
EXPECT_FALSE(GetActiveNearbyInitiatorAttempt(details_for_attempt));
}
void FinishBleInitiatorAttemptWithConnection(
FakeConnectionAttempt<BleInitiatorFailureType>* attempt, FakeConnectionAttempt<BleInitiatorFailureType>* attempt,
size_t num_extracted_clients_to_generate) { size_t num_extracted_clients_to_generate) {
ConnectionAttemptDetails details_for_attempt = ConnectionAttemptDetails details_for_attempt =
attempt->connection_attempt_details(); attempt->connection_attempt_details();
EXPECT_EQ(GetActiveInitiatorAttempt(details_for_attempt), attempt); EXPECT_EQ(GetActiveBleInitiatorAttempt(details_for_attempt), attempt);
FakePendingConnectionManagerDelegate::ReceivedConnectionsList& FakePendingConnectionManagerDelegate::ReceivedConnectionsList&
received_connections = fake_delegate_->received_connections_list(); received_connections = fake_delegate_->received_connections_list();
...@@ -469,7 +660,7 @@ class SecureChannelPendingConnectionManagerImplTest : public testing::Test { ...@@ -469,7 +660,7 @@ class SecureChannelPendingConnectionManagerImplTest : public testing::Test {
attempt->set_client_data_for_extraction(std::move(clients_to_send)); attempt->set_client_data_for_extraction(std::move(clients_to_send));
attempt->OnConnectionAttemptSucceeded(move(fake_authenticated_channel)); attempt->OnConnectionAttemptSucceeded(move(fake_authenticated_channel));
EXPECT_FALSE(GetActiveInitiatorAttempt(details_for_attempt)); EXPECT_FALSE(GetActiveBleInitiatorAttempt(details_for_attempt));
EXPECT_EQ(num_received_connections_before_call + 1u, EXPECT_EQ(num_received_connections_before_call + 1u,
received_connections.size()); received_connections.size());
EXPECT_EQ(fake_authenticated_channel_raw, EXPECT_EQ(fake_authenticated_channel_raw,
...@@ -480,12 +671,47 @@ class SecureChannelPendingConnectionManagerImplTest : public testing::Test { ...@@ -480,12 +671,47 @@ class SecureChannelPendingConnectionManagerImplTest : public testing::Test {
std::get<2>(received_connections.back())); std::get<2>(received_connections.back()));
} }
void FinishListenerAttemptWithConnection( void FinishBleListenerAttemptWithConnection(
FakeConnectionAttempt<BleListenerFailureType>* attempt, FakeConnectionAttempt<BleListenerFailureType>* attempt,
size_t num_extracted_clients_to_generate) { size_t num_extracted_clients_to_generate) {
ConnectionAttemptDetails details_for_attempt = ConnectionAttemptDetails details_for_attempt =
attempt->connection_attempt_details(); attempt->connection_attempt_details();
EXPECT_EQ(GetActiveListenerAttempt(details_for_attempt), attempt); EXPECT_EQ(GetActiveBleListenerAttempt(details_for_attempt), attempt);
FakePendingConnectionManagerDelegate::ReceivedConnectionsList&
received_connections = fake_delegate_->received_connections_list();
size_t num_received_connections_before_call = received_connections.size();
auto fake_authenticated_channel =
std::make_unique<FakeAuthenticatedChannel>();
FakeAuthenticatedChannel* fake_authenticated_channel_raw =
fake_authenticated_channel.get();
std::vector<std::unique_ptr<ClientConnectionParameters>> clients_to_send =
GenerateFakeClientParameters(num_extracted_clients_to_generate);
std::vector<ClientConnectionParameters*> raw_client_list =
ClientParamsListToRawPtrs(clients_to_send);
attempt->set_client_data_for_extraction(std::move(clients_to_send));
attempt->OnConnectionAttemptSucceeded(move(fake_authenticated_channel));
EXPECT_FALSE(GetActiveBleListenerAttempt(details_for_attempt));
EXPECT_EQ(num_received_connections_before_call + 1u,
received_connections.size());
EXPECT_EQ(fake_authenticated_channel_raw,
std::get<0>(received_connections.back()).get());
EXPECT_EQ(raw_client_list, ClientParamsListToRawPtrs(
std::get<1>(received_connections.back())));
EXPECT_EQ(details_for_attempt.GetAssociatedConnectionDetails(),
std::get<2>(received_connections.back()));
}
void FinishNearbyInitiatorAttemptWithConnection(
FakeConnectionAttempt<NearbyInitiatorFailureType>* attempt,
size_t num_extracted_clients_to_generate) {
ConnectionAttemptDetails details_for_attempt =
attempt->connection_attempt_details();
EXPECT_EQ(GetActiveNearbyInitiatorAttempt(details_for_attempt), attempt);
FakePendingConnectionManagerDelegate::ReceivedConnectionsList& FakePendingConnectionManagerDelegate::ReceivedConnectionsList&
received_connections = fake_delegate_->received_connections_list(); received_connections = fake_delegate_->received_connections_list();
...@@ -504,7 +730,7 @@ class SecureChannelPendingConnectionManagerImplTest : public testing::Test { ...@@ -504,7 +730,7 @@ class SecureChannelPendingConnectionManagerImplTest : public testing::Test {
attempt->set_client_data_for_extraction(std::move(clients_to_send)); attempt->set_client_data_for_extraction(std::move(clients_to_send));
attempt->OnConnectionAttemptSucceeded(move(fake_authenticated_channel)); attempt->OnConnectionAttemptSucceeded(move(fake_authenticated_channel));
EXPECT_FALSE(GetActiveListenerAttempt(details_for_attempt)); EXPECT_FALSE(GetActiveNearbyInitiatorAttempt(details_for_attempt));
EXPECT_EQ(num_received_connections_before_call + 1u, EXPECT_EQ(num_received_connections_before_call + 1u,
received_connections.size()); received_connections.size());
EXPECT_EQ(fake_authenticated_channel_raw, EXPECT_EQ(fake_authenticated_channel_raw,
...@@ -515,38 +741,55 @@ class SecureChannelPendingConnectionManagerImplTest : public testing::Test { ...@@ -515,38 +741,55 @@ class SecureChannelPendingConnectionManagerImplTest : public testing::Test {
std::get<2>(received_connections.back())); std::get<2>(received_connections.back()));
} }
FakeConnectionAttempt<BleInitiatorFailureType>* GetActiveInitiatorAttempt( FakeConnectionAttempt<BleInitiatorFailureType>* GetActiveBleInitiatorAttempt(
const ConnectionAttemptDetails& connection_attempt_details) { const ConnectionAttemptDetails& connection_attempt_details) {
return fake_ble_initiator_connection_attempt_factory_ return fake_ble_initiator_connection_attempt_factory_
->details_to_active_attempt_map()[connection_attempt_details]; ->details_to_active_attempt_map()[connection_attempt_details];
} }
FakeConnectionAttempt<BleListenerFailureType>* GetActiveListenerAttempt( FakeConnectionAttempt<BleListenerFailureType>* GetActiveBleListenerAttempt(
const ConnectionAttemptDetails& connection_attempt_details) { const ConnectionAttemptDetails& connection_attempt_details) {
return fake_ble_listener_connection_attempt_factory_ return fake_ble_listener_connection_attempt_factory_
->details_to_active_attempt_map()[connection_attempt_details]; ->details_to_active_attempt_map()[connection_attempt_details];
} }
size_t GetNumInitiatorAttemptsCreated() { FakeConnectionAttempt<NearbyInitiatorFailureType>*
GetActiveNearbyInitiatorAttempt(
const ConnectionAttemptDetails& connection_attempt_details) {
return fake_nearby_initiator_connection_attempt_factory_
->details_to_active_attempt_map()[connection_attempt_details];
}
size_t GetNumBleInitiatorAttemptsCreated() {
return fake_ble_initiator_connection_attempt_factory_ return fake_ble_initiator_connection_attempt_factory_
->num_instances_created(); ->num_instances_created();
} }
size_t GetNumListenerAttemptsCreated() { size_t GetNumBleListenerAttemptsCreated() {
return fake_ble_listener_connection_attempt_factory_ return fake_ble_listener_connection_attempt_factory_
->num_instances_created(); ->num_instances_created();
} }
size_t GetNumInitiatorAttemptsDeleted() { size_t GetNumNearbyInitiatorAttemptsCreated() {
return fake_nearby_initiator_connection_attempt_factory_
->num_instances_created();
}
size_t GetNumBleInitiatorAttemptsDeleted() {
return fake_ble_initiator_connection_attempt_factory_ return fake_ble_initiator_connection_attempt_factory_
->num_instances_deleted(); ->num_instances_deleted();
} }
size_t GetNumListenerAttemptsDeleted() { size_t GetNumBleListenerAttemptsDeleted() {
return fake_ble_listener_connection_attempt_factory_ return fake_ble_listener_connection_attempt_factory_
->num_instances_deleted(); ->num_instances_deleted();
} }
size_t GetNumNearbyInitiatorAttemptsDeleted() {
return fake_nearby_initiator_connection_attempt_factory_
->num_instances_deleted();
}
private: private:
void HandleConnectionRequest( void HandleConnectionRequest(
const ConnectionAttemptDetails& connection_attempt_details, const ConnectionAttemptDetails& connection_attempt_details,
...@@ -560,6 +803,8 @@ class SecureChannelPendingConnectionManagerImplTest : public testing::Test { ...@@ -560,6 +803,8 @@ class SecureChannelPendingConnectionManagerImplTest : public testing::Test {
if (cancel_request_before_adding) { if (cancel_request_before_adding) {
fake_client_connection_parameters->CancelClientRequest(); fake_client_connection_parameters->CancelClientRequest();
} else { } else {
switch (connection_attempt_details.connection_medium()) {
case ConnectionMedium::kBluetoothLowEnergy:
switch (connection_attempt_details.connection_role()) { switch (connection_attempt_details.connection_role()) {
case ConnectionRole::kInitiatorRole: case ConnectionRole::kInitiatorRole:
fake_ble_initiator_connection_attempt_factory_ fake_ble_initiator_connection_attempt_factory_
...@@ -567,7 +812,8 @@ class SecureChannelPendingConnectionManagerImplTest : public testing::Test { ...@@ -567,7 +812,8 @@ class SecureChannelPendingConnectionManagerImplTest : public testing::Test {
connection_attempt_details); connection_attempt_details);
fake_pending_ble_initiator_connection_request_factory_ fake_pending_ble_initiator_connection_request_factory_
->SetExpectationsForNextCall( ->SetExpectationsForNextCall(
fake_client_connection_parameters_raw, connection_priority); fake_client_connection_parameters_raw,
connection_priority);
break; break;
case ConnectionRole::kListenerRole: case ConnectionRole::kListenerRole:
...@@ -576,7 +822,28 @@ class SecureChannelPendingConnectionManagerImplTest : public testing::Test { ...@@ -576,7 +822,28 @@ class SecureChannelPendingConnectionManagerImplTest : public testing::Test {
connection_attempt_details); connection_attempt_details);
fake_pending_ble_listener_connection_request_factory_ fake_pending_ble_listener_connection_request_factory_
->SetExpectationsForNextCall( ->SetExpectationsForNextCall(
fake_client_connection_parameters_raw, connection_priority); fake_client_connection_parameters_raw,
connection_priority);
break;
}
break;
case ConnectionMedium::kNearbyConnections:
switch (connection_attempt_details.connection_role()) {
case ConnectionRole::kInitiatorRole:
fake_nearby_initiator_connection_attempt_factory_
->set_expected_connection_attempt_details(
connection_attempt_details);
fake_pending_nearby_initiator_connection_request_factory_
->SetExpectationsForNextCall(
fake_client_connection_parameters_raw,
connection_priority);
break;
case ConnectionRole::kListenerRole:
NOTREACHED();
break;
}
break; break;
} }
} }
...@@ -590,15 +857,20 @@ class SecureChannelPendingConnectionManagerImplTest : public testing::Test { ...@@ -590,15 +857,20 @@ class SecureChannelPendingConnectionManagerImplTest : public testing::Test {
std::unique_ptr<FakePendingConnectionManagerDelegate> fake_delegate_; std::unique_ptr<FakePendingConnectionManagerDelegate> fake_delegate_;
std::unique_ptr<FakeBleConnectionManager> fake_ble_connection_manager_; std::unique_ptr<FakeBleConnectionManager> fake_ble_connection_manager_;
std::unique_ptr<FakeNearbyConnectionManager> fake_nearby_connection_manager_;
std::unique_ptr<FakeBleInitiatorConnectionAttemptFactory> std::unique_ptr<FakeBleInitiatorConnectionAttemptFactory>
fake_ble_initiator_connection_attempt_factory_; fake_ble_initiator_connection_attempt_factory_;
std::unique_ptr<FakeBleListenerConnectionAttemptFactory> std::unique_ptr<FakeBleListenerConnectionAttemptFactory>
fake_ble_listener_connection_attempt_factory_; fake_ble_listener_connection_attempt_factory_;
std::unique_ptr<FakeNearbyInitiatorConnectionAttemptFactory>
fake_nearby_initiator_connection_attempt_factory_;
std::unique_ptr<FakePendingBleInitiatorConnectionRequestFactory> std::unique_ptr<FakePendingBleInitiatorConnectionRequestFactory>
fake_pending_ble_initiator_connection_request_factory_; fake_pending_ble_initiator_connection_request_factory_;
std::unique_ptr<FakePendingBleListenerConnectionRequestFactory> std::unique_ptr<FakePendingBleListenerConnectionRequestFactory>
fake_pending_ble_listener_connection_request_factory_; fake_pending_ble_listener_connection_request_factory_;
std::unique_ptr<FakePendingNearbyInitiatorConnectionRequestFactory>
fake_pending_nearby_initiator_connection_request_factory_;
scoped_refptr<testing::NiceMock<device::MockBluetoothAdapter>> mock_adapter_; scoped_refptr<testing::NiceMock<device::MockBluetoothAdapter>> mock_adapter_;
std::unique_ptr<PendingConnectionManager> manager_; std::unique_ptr<PendingConnectionManager> manager_;
...@@ -608,23 +880,30 @@ class SecureChannelPendingConnectionManagerImplTest : public testing::Test { ...@@ -608,23 +880,30 @@ class SecureChannelPendingConnectionManagerImplTest : public testing::Test {
TEST_F(SecureChannelPendingConnectionManagerImplTest, TEST_F(SecureChannelPendingConnectionManagerImplTest,
CanceledRequestNotProcessed) { CanceledRequestNotProcessed) {
// Initiator. // BLE initiator.
HandleCanceledRequestAndVerifyNoInstancesCreated( HandleCanceledRequestAndVerifyNoInstancesCreated(
ConnectionAttemptDetails("remoteDeviceId", "localDeviceId", ConnectionAttemptDetails("remoteDeviceId", "localDeviceId",
ConnectionMedium::kBluetoothLowEnergy, ConnectionMedium::kBluetoothLowEnergy,
ConnectionRole::kInitiatorRole), ConnectionRole::kInitiatorRole),
ConnectionPriority::kLow); ConnectionPriority::kLow);
// Listener. // BLE listener.
HandleCanceledRequestAndVerifyNoInstancesCreated( HandleCanceledRequestAndVerifyNoInstancesCreated(
ConnectionAttemptDetails("remoteDeviceId", "localDeviceId", ConnectionAttemptDetails("remoteDeviceId", "localDeviceId",
ConnectionMedium::kBluetoothLowEnergy, ConnectionMedium::kBluetoothLowEnergy,
ConnectionRole::kListenerRole), ConnectionRole::kListenerRole),
ConnectionPriority::kLow); ConnectionPriority::kLow);
// Nearby initiator.
HandleCanceledRequestAndVerifyNoInstancesCreated(
ConnectionAttemptDetails("remoteDeviceId", "localDeviceId",
ConnectionMedium::kNearbyConnections,
ConnectionRole::kInitiatorRole),
ConnectionPriority::kLow);
} }
TEST_F(SecureChannelPendingConnectionManagerImplTest, TEST_F(SecureChannelPendingConnectionManagerImplTest,
AttemptFinishesWithoutConnection_Initiator) { AttemptFinishesWithoutConnection_BleInitiator) {
ConnectionAttemptDetails details("remoteDeviceId", "localDeviceId", ConnectionAttemptDetails details("remoteDeviceId", "localDeviceId",
ConnectionMedium::kBluetoothLowEnergy, ConnectionMedium::kBluetoothLowEnergy,
ConnectionRole::kInitiatorRole); ConnectionRole::kInitiatorRole);
...@@ -632,20 +911,22 @@ TEST_F(SecureChannelPendingConnectionManagerImplTest, ...@@ -632,20 +911,22 @@ TEST_F(SecureChannelPendingConnectionManagerImplTest,
// One request by itself. // One request by itself.
HandleRequestAndVerifyHandledByConnectionAttempt(details, HandleRequestAndVerifyHandledByConnectionAttempt(details,
ConnectionPriority::kLow); ConnectionPriority::kLow);
FinishInitiatorAttemptWithoutConnection(GetActiveInitiatorAttempt(details)); FinishBleInitiatorAttemptWithoutConnection(
EXPECT_EQ(1u, GetNumInitiatorAttemptsCreated()); GetActiveBleInitiatorAttempt(details));
EXPECT_EQ(1u, GetNumBleInitiatorAttemptsCreated());
// Two requests at the same time. // Two requests at the same time.
HandleRequestAndVerifyHandledByConnectionAttempt(details, HandleRequestAndVerifyHandledByConnectionAttempt(details,
ConnectionPriority::kMedium); ConnectionPriority::kMedium);
HandleRequestAndVerifyHandledByConnectionAttempt(details, HandleRequestAndVerifyHandledByConnectionAttempt(details,
ConnectionPriority::kHigh); ConnectionPriority::kHigh);
FinishInitiatorAttemptWithoutConnection(GetActiveInitiatorAttempt(details)); FinishBleInitiatorAttemptWithoutConnection(
EXPECT_EQ(2u, GetNumInitiatorAttemptsCreated()); GetActiveBleInitiatorAttempt(details));
EXPECT_EQ(2u, GetNumBleInitiatorAttemptsCreated());
} }
TEST_F(SecureChannelPendingConnectionManagerImplTest, TEST_F(SecureChannelPendingConnectionManagerImplTest,
AttemptFinishesWithoutConnection_Listener) { AttemptFinishesWithoutConnection_BleListener) {
ConnectionAttemptDetails details("remoteDeviceId", "localDeviceId", ConnectionAttemptDetails details("remoteDeviceId", "localDeviceId",
ConnectionMedium::kBluetoothLowEnergy, ConnectionMedium::kBluetoothLowEnergy,
ConnectionRole::kListenerRole); ConnectionRole::kListenerRole);
...@@ -653,20 +934,45 @@ TEST_F(SecureChannelPendingConnectionManagerImplTest, ...@@ -653,20 +934,45 @@ TEST_F(SecureChannelPendingConnectionManagerImplTest,
// One request by itself. // One request by itself.
HandleRequestAndVerifyHandledByConnectionAttempt(details, HandleRequestAndVerifyHandledByConnectionAttempt(details,
ConnectionPriority::kLow); ConnectionPriority::kLow);
FinishListenerAttemptWithoutConnection(GetActiveListenerAttempt(details)); FinishBleListenerAttemptWithoutConnection(
EXPECT_EQ(1u, GetNumListenerAttemptsCreated()); GetActiveBleListenerAttempt(details));
EXPECT_EQ(1u, GetNumBleListenerAttemptsCreated());
// Two requests at the same time.
HandleRequestAndVerifyHandledByConnectionAttempt(details,
ConnectionPriority::kMedium);
HandleRequestAndVerifyHandledByConnectionAttempt(details,
ConnectionPriority::kHigh);
FinishBleListenerAttemptWithoutConnection(
GetActiveBleListenerAttempt(details));
EXPECT_EQ(2u, GetNumBleListenerAttemptsCreated());
}
TEST_F(SecureChannelPendingConnectionManagerImplTest,
AttemptFinishesWithoutConnection_NearbyInitiator) {
ConnectionAttemptDetails details("remoteDeviceId", "localDeviceId",
ConnectionMedium::kNearbyConnections,
ConnectionRole::kInitiatorRole);
// One request by itself.
HandleRequestAndVerifyHandledByConnectionAttempt(details,
ConnectionPriority::kLow);
FinishNearbyInitiatorAttemptWithoutConnection(
GetActiveNearbyInitiatorAttempt(details));
EXPECT_EQ(1u, GetNumNearbyInitiatorAttemptsCreated());
// Two requests at the same time. // Two requests at the same time.
HandleRequestAndVerifyHandledByConnectionAttempt(details, HandleRequestAndVerifyHandledByConnectionAttempt(details,
ConnectionPriority::kMedium); ConnectionPriority::kMedium);
HandleRequestAndVerifyHandledByConnectionAttempt(details, HandleRequestAndVerifyHandledByConnectionAttempt(details,
ConnectionPriority::kHigh); ConnectionPriority::kHigh);
FinishListenerAttemptWithoutConnection(GetActiveListenerAttempt(details)); FinishNearbyInitiatorAttemptWithoutConnection(
EXPECT_EQ(2u, GetNumListenerAttemptsCreated()); GetActiveNearbyInitiatorAttempt(details));
EXPECT_EQ(2u, GetNumNearbyInitiatorAttemptsCreated());
} }
TEST_F(SecureChannelPendingConnectionManagerImplTest, TEST_F(SecureChannelPendingConnectionManagerImplTest,
AttemptSucceeds_Initiator) { AttemptSucceeds_BleInitiator) {
ConnectionAttemptDetails details("remoteDeviceId", "localDeviceId", ConnectionAttemptDetails details("remoteDeviceId", "localDeviceId",
ConnectionMedium::kBluetoothLowEnergy, ConnectionMedium::kBluetoothLowEnergy,
ConnectionRole::kInitiatorRole); ConnectionRole::kInitiatorRole);
...@@ -674,26 +980,26 @@ TEST_F(SecureChannelPendingConnectionManagerImplTest, ...@@ -674,26 +980,26 @@ TEST_F(SecureChannelPendingConnectionManagerImplTest,
// One request by itself. // One request by itself.
HandleRequestAndVerifyHandledByConnectionAttempt(details, HandleRequestAndVerifyHandledByConnectionAttempt(details,
ConnectionPriority::kLow); ConnectionPriority::kLow);
FinishInitiatorAttemptWithConnection( FinishBleInitiatorAttemptWithConnection(
GetActiveInitiatorAttempt(details), GetActiveBleInitiatorAttempt(details),
1u /* num_extracted_clients_to_generate */); 1u /* num_extracted_clients_to_generate */);
EXPECT_EQ(1u, GetNumInitiatorAttemptsCreated()); EXPECT_EQ(1u, GetNumBleInitiatorAttemptsCreated());
EXPECT_EQ(1u, GetNumInitiatorAttemptsDeleted()); EXPECT_EQ(1u, GetNumBleInitiatorAttemptsDeleted());
// Two requests at the same time. // Two requests at the same time.
HandleRequestAndVerifyHandledByConnectionAttempt(details, HandleRequestAndVerifyHandledByConnectionAttempt(details,
ConnectionPriority::kMedium); ConnectionPriority::kMedium);
HandleRequestAndVerifyHandledByConnectionAttempt(details, HandleRequestAndVerifyHandledByConnectionAttempt(details,
ConnectionPriority::kHigh); ConnectionPriority::kHigh);
FinishInitiatorAttemptWithConnection( FinishBleInitiatorAttemptWithConnection(
GetActiveInitiatorAttempt(details), GetActiveBleInitiatorAttempt(details),
2u /* num_extracted_clients_to_generate */); 2u /* num_extracted_clients_to_generate */);
EXPECT_EQ(2u, GetNumInitiatorAttemptsCreated()); EXPECT_EQ(2u, GetNumBleInitiatorAttemptsCreated());
EXPECT_EQ(2u, GetNumInitiatorAttemptsDeleted()); EXPECT_EQ(2u, GetNumBleInitiatorAttemptsDeleted());
} }
TEST_F(SecureChannelPendingConnectionManagerImplTest, TEST_F(SecureChannelPendingConnectionManagerImplTest,
AttemptSucceeds_Listener) { AttemptSucceeds_BleListener) {
ConnectionAttemptDetails details("remoteDeviceId", "localDeviceId", ConnectionAttemptDetails details("remoteDeviceId", "localDeviceId",
ConnectionMedium::kBluetoothLowEnergy, ConnectionMedium::kBluetoothLowEnergy,
ConnectionRole::kListenerRole); ConnectionRole::kListenerRole);
...@@ -701,22 +1007,49 @@ TEST_F(SecureChannelPendingConnectionManagerImplTest, ...@@ -701,22 +1007,49 @@ TEST_F(SecureChannelPendingConnectionManagerImplTest,
// One request by itself. // One request by itself.
HandleRequestAndVerifyHandledByConnectionAttempt(details, HandleRequestAndVerifyHandledByConnectionAttempt(details,
ConnectionPriority::kLow); ConnectionPriority::kLow);
FinishListenerAttemptWithConnection( FinishBleListenerAttemptWithConnection(
GetActiveListenerAttempt(details), GetActiveBleListenerAttempt(details),
1u /* num_extracted_clients_to_generate */);
EXPECT_EQ(1u, GetNumBleListenerAttemptsCreated());
EXPECT_EQ(1u, GetNumBleListenerAttemptsDeleted());
// Two requests at the same time.
HandleRequestAndVerifyHandledByConnectionAttempt(details,
ConnectionPriority::kMedium);
HandleRequestAndVerifyHandledByConnectionAttempt(details,
ConnectionPriority::kHigh);
FinishBleListenerAttemptWithConnection(
GetActiveBleListenerAttempt(details),
2u /* num_extracted_clients_to_generate */);
EXPECT_EQ(2u, GetNumBleListenerAttemptsCreated());
EXPECT_EQ(2u, GetNumBleListenerAttemptsDeleted());
}
TEST_F(SecureChannelPendingConnectionManagerImplTest,
AttemptSucceeds_NearbyInitiator) {
ConnectionAttemptDetails details("remoteDeviceId", "localDeviceId",
ConnectionMedium::kNearbyConnections,
ConnectionRole::kInitiatorRole);
// One request by itself.
HandleRequestAndVerifyHandledByConnectionAttempt(details,
ConnectionPriority::kLow);
FinishNearbyInitiatorAttemptWithConnection(
GetActiveNearbyInitiatorAttempt(details),
1u /* num_extracted_clients_to_generate */); 1u /* num_extracted_clients_to_generate */);
EXPECT_EQ(1u, GetNumListenerAttemptsCreated()); EXPECT_EQ(1u, GetNumNearbyInitiatorAttemptsCreated());
EXPECT_EQ(1u, GetNumListenerAttemptsDeleted()); EXPECT_EQ(1u, GetNumNearbyInitiatorAttemptsDeleted());
// Two requests at the same time. // Two requests at the same time.
HandleRequestAndVerifyHandledByConnectionAttempt(details, HandleRequestAndVerifyHandledByConnectionAttempt(details,
ConnectionPriority::kMedium); ConnectionPriority::kMedium);
HandleRequestAndVerifyHandledByConnectionAttempt(details, HandleRequestAndVerifyHandledByConnectionAttempt(details,
ConnectionPriority::kHigh); ConnectionPriority::kHigh);
FinishListenerAttemptWithConnection( FinishNearbyInitiatorAttemptWithConnection(
GetActiveListenerAttempt(details), GetActiveNearbyInitiatorAttempt(details),
2u /* num_extracted_clients_to_generate */); 2u /* num_extracted_clients_to_generate */);
EXPECT_EQ(2u, GetNumListenerAttemptsCreated()); EXPECT_EQ(2u, GetNumNearbyInitiatorAttemptsCreated());
EXPECT_EQ(2u, GetNumListenerAttemptsDeleted()); EXPECT_EQ(2u, GetNumNearbyInitiatorAttemptsDeleted());
} }
TEST_F(SecureChannelPendingConnectionManagerImplTest, TEST_F(SecureChannelPendingConnectionManagerImplTest,
...@@ -744,22 +1077,22 @@ TEST_F(SecureChannelPendingConnectionManagerImplTest, ...@@ -744,22 +1077,22 @@ TEST_F(SecureChannelPendingConnectionManagerImplTest,
local_device_2_initiator_details, ConnectionPriority::kHigh); local_device_2_initiator_details, ConnectionPriority::kHigh);
HandleRequestAndVerifyHandledByConnectionAttempt( HandleRequestAndVerifyHandledByConnectionAttempt(
local_device_2_listener_details, ConnectionPriority::kLow); local_device_2_listener_details, ConnectionPriority::kLow);
EXPECT_EQ(2u, GetNumListenerAttemptsCreated()); EXPECT_EQ(2u, GetNumBleListenerAttemptsCreated());
EXPECT_EQ(2u, GetNumInitiatorAttemptsCreated()); EXPECT_EQ(2u, GetNumBleInitiatorAttemptsCreated());
EXPECT_EQ(0u, GetNumListenerAttemptsDeleted()); EXPECT_EQ(0u, GetNumBleListenerAttemptsDeleted());
EXPECT_EQ(0u, GetNumInitiatorAttemptsDeleted()); EXPECT_EQ(0u, GetNumBleInitiatorAttemptsDeleted());
// Find a connection, arbitrarily choosing |local_device_1_initiator_details| // Find a connection, arbitrarily choosing |local_device_1_initiator_details|
// as the request which produces the connection. Since all 4 of these requests // as the request which produces the connection. Since all 4 of these requests
// were to the same remote device, all 4 of them should be deleted when the // were to the same remote device, all 4 of them should be deleted when the
// connection is established. // connection is established.
FinishInitiatorAttemptWithConnection( FinishBleInitiatorAttemptWithConnection(
GetActiveInitiatorAttempt(local_device_1_initiator_details), GetActiveBleInitiatorAttempt(local_device_1_initiator_details),
4u /* num_extracted_clients_to_generate */); 4u /* num_extracted_clients_to_generate */);
EXPECT_EQ(2u, GetNumListenerAttemptsCreated()); EXPECT_EQ(2u, GetNumBleListenerAttemptsCreated());
EXPECT_EQ(2u, GetNumInitiatorAttemptsCreated()); EXPECT_EQ(2u, GetNumBleInitiatorAttemptsCreated());
EXPECT_EQ(2u, GetNumListenerAttemptsDeleted()); EXPECT_EQ(2u, GetNumBleListenerAttemptsDeleted());
EXPECT_EQ(2u, GetNumInitiatorAttemptsDeleted()); EXPECT_EQ(2u, GetNumBleInitiatorAttemptsDeleted());
} }
TEST_F(SecureChannelPendingConnectionManagerImplTest, TEST_F(SecureChannelPendingConnectionManagerImplTest,
...@@ -787,47 +1120,47 @@ TEST_F(SecureChannelPendingConnectionManagerImplTest, ...@@ -787,47 +1120,47 @@ TEST_F(SecureChannelPendingConnectionManagerImplTest,
ConnectionPriority::kHigh); ConnectionPriority::kHigh);
HandleRequestAndVerifyHandledByConnectionAttempt(details_4, HandleRequestAndVerifyHandledByConnectionAttempt(details_4,
ConnectionPriority::kLow); ConnectionPriority::kLow);
EXPECT_EQ(2u, GetNumListenerAttemptsCreated()); EXPECT_EQ(2u, GetNumBleListenerAttemptsCreated());
EXPECT_EQ(2u, GetNumInitiatorAttemptsCreated()); EXPECT_EQ(2u, GetNumBleInitiatorAttemptsCreated());
EXPECT_EQ(0u, GetNumListenerAttemptsDeleted()); EXPECT_EQ(0u, GetNumBleListenerAttemptsDeleted());
EXPECT_EQ(0u, GetNumInitiatorAttemptsDeleted()); EXPECT_EQ(0u, GetNumBleInitiatorAttemptsDeleted());
// Find a connection for |details_1|; only one ConnectionAttempt should have // Find a connection for |details_1|; only one ConnectionAttempt should have
// been deleted. // been deleted.
FinishInitiatorAttemptWithConnection( FinishBleInitiatorAttemptWithConnection(
GetActiveInitiatorAttempt(details_1), GetActiveBleInitiatorAttempt(details_1),
1u /* num_extracted_clients_to_generate */); 1u /* num_extracted_clients_to_generate */);
EXPECT_EQ(2u, GetNumListenerAttemptsCreated()); EXPECT_EQ(2u, GetNumBleListenerAttemptsCreated());
EXPECT_EQ(2u, GetNumInitiatorAttemptsCreated()); EXPECT_EQ(2u, GetNumBleInitiatorAttemptsCreated());
EXPECT_EQ(0u, GetNumListenerAttemptsDeleted()); EXPECT_EQ(0u, GetNumBleListenerAttemptsDeleted());
EXPECT_EQ(1u, GetNumInitiatorAttemptsDeleted()); EXPECT_EQ(1u, GetNumBleInitiatorAttemptsDeleted());
// Find a connection for |details_2|. // Find a connection for |details_2|.
FinishListenerAttemptWithConnection( FinishBleListenerAttemptWithConnection(
GetActiveListenerAttempt(details_2), GetActiveBleListenerAttempt(details_2),
1u /* num_extracted_clients_to_generate */); 1u /* num_extracted_clients_to_generate */);
EXPECT_EQ(2u, GetNumListenerAttemptsCreated()); EXPECT_EQ(2u, GetNumBleListenerAttemptsCreated());
EXPECT_EQ(2u, GetNumInitiatorAttemptsCreated()); EXPECT_EQ(2u, GetNumBleInitiatorAttemptsCreated());
EXPECT_EQ(1u, GetNumListenerAttemptsDeleted()); EXPECT_EQ(1u, GetNumBleListenerAttemptsDeleted());
EXPECT_EQ(1u, GetNumInitiatorAttemptsDeleted()); EXPECT_EQ(1u, GetNumBleInitiatorAttemptsDeleted());
// |details_3|. // |details_3|.
FinishInitiatorAttemptWithConnection( FinishBleInitiatorAttemptWithConnection(
GetActiveInitiatorAttempt(details_3), GetActiveBleInitiatorAttempt(details_3),
1u /* num_extracted_clients_to_generate */); 1u /* num_extracted_clients_to_generate */);
EXPECT_EQ(2u, GetNumListenerAttemptsCreated()); EXPECT_EQ(2u, GetNumBleListenerAttemptsCreated());
EXPECT_EQ(2u, GetNumInitiatorAttemptsCreated()); EXPECT_EQ(2u, GetNumBleInitiatorAttemptsCreated());
EXPECT_EQ(1u, GetNumListenerAttemptsDeleted()); EXPECT_EQ(1u, GetNumBleListenerAttemptsDeleted());
EXPECT_EQ(2u, GetNumInitiatorAttemptsDeleted()); EXPECT_EQ(2u, GetNumBleInitiatorAttemptsDeleted());
// |details_4|. // |details_4|.
FinishListenerAttemptWithConnection( FinishBleListenerAttemptWithConnection(
GetActiveListenerAttempt(details_4), GetActiveBleListenerAttempt(details_4),
1u /* num_extracted_clients_to_generate */); 1u /* num_extracted_clients_to_generate */);
EXPECT_EQ(2u, GetNumListenerAttemptsCreated()); EXPECT_EQ(2u, GetNumBleListenerAttemptsCreated());
EXPECT_EQ(2u, GetNumInitiatorAttemptsCreated()); EXPECT_EQ(2u, GetNumBleInitiatorAttemptsCreated());
EXPECT_EQ(2u, GetNumListenerAttemptsDeleted()); EXPECT_EQ(2u, GetNumBleListenerAttemptsDeleted());
EXPECT_EQ(2u, GetNumInitiatorAttemptsDeleted()); EXPECT_EQ(2u, GetNumBleInitiatorAttemptsDeleted());
} }
} // namespace secure_channel } // namespace secure_channel
......
...@@ -18,6 +18,7 @@ ...@@ -18,6 +18,7 @@
#include "chromeos/services/secure_channel/bluetooth_helper_impl.h" #include "chromeos/services/secure_channel/bluetooth_helper_impl.h"
#include "chromeos/services/secure_channel/client_connection_parameters_impl.h" #include "chromeos/services/secure_channel/client_connection_parameters_impl.h"
#include "chromeos/services/secure_channel/device_id_pair.h" #include "chromeos/services/secure_channel/device_id_pair.h"
#include "chromeos/services/secure_channel/nearby_connection_manager_impl.h"
#include "chromeos/services/secure_channel/pending_connection_manager_impl.h" #include "chromeos/services/secure_channel/pending_connection_manager_impl.h"
#include "chromeos/services/secure_channel/timer_factory_impl.h" #include "chromeos/services/secure_channel/timer_factory_impl.h"
#include "device/bluetooth/bluetooth_adapter.h" #include "device/bluetooth/bluetooth_adapter.h"
...@@ -80,9 +81,12 @@ SecureChannelImpl::SecureChannelImpl( ...@@ -80,9 +81,12 @@ SecureChannelImpl::SecureChannelImpl(
ble_synchronizer_.get(), ble_synchronizer_.get(),
ble_scanner_.get(), ble_scanner_.get(),
timer_factory_.get())), timer_factory_.get())),
nearby_connection_manager_(
NearbyConnectionManagerImpl::Factory::Create()),
pending_connection_manager_(PendingConnectionManagerImpl::Factory::Create( pending_connection_manager_(PendingConnectionManagerImpl::Factory::Create(
this /* delegate */, this /* delegate */,
ble_connection_manager_.get(), ble_connection_manager_.get(),
nearby_connection_manager_.get(),
bluetooth_adapter_)), bluetooth_adapter_)),
active_connection_manager_( active_connection_manager_(
ActiveConnectionManagerImpl::Factory::Create(this /* delegate */)) {} ActiveConnectionManagerImpl::Factory::Create(this /* delegate */)) {}
......
...@@ -32,6 +32,7 @@ class BleConnectionManager; ...@@ -32,6 +32,7 @@ class BleConnectionManager;
class BleScanner; class BleScanner;
class BluetoothHelper; class BluetoothHelper;
class BleSynchronizerBase; class BleSynchronizerBase;
class NearbyConnectionManager;
class TimerFactory; class TimerFactory;
// Concrete SecureChannelImpl implementation, which contains three pieces: // Concrete SecureChannelImpl implementation, which contains three pieces:
...@@ -178,6 +179,7 @@ class SecureChannelImpl : public mojom::SecureChannel, ...@@ -178,6 +179,7 @@ class SecureChannelImpl : public mojom::SecureChannel,
std::unique_ptr<BleSynchronizerBase> ble_synchronizer_; std::unique_ptr<BleSynchronizerBase> ble_synchronizer_;
std::unique_ptr<BleScanner> ble_scanner_; std::unique_ptr<BleScanner> ble_scanner_;
std::unique_ptr<BleConnectionManager> ble_connection_manager_; std::unique_ptr<BleConnectionManager> ble_connection_manager_;
std::unique_ptr<NearbyConnectionManager> nearby_connection_manager_;
std::unique_ptr<PendingConnectionManager> pending_connection_manager_; std::unique_ptr<PendingConnectionManager> pending_connection_manager_;
std::unique_ptr<ActiveConnectionManager> active_connection_manager_; std::unique_ptr<ActiveConnectionManager> active_connection_manager_;
......
...@@ -28,8 +28,10 @@ ...@@ -28,8 +28,10 @@
#include "chromeos/services/secure_channel/fake_bluetooth_helper.h" #include "chromeos/services/secure_channel/fake_bluetooth_helper.h"
#include "chromeos/services/secure_channel/fake_client_connection_parameters.h" #include "chromeos/services/secure_channel/fake_client_connection_parameters.h"
#include "chromeos/services/secure_channel/fake_connection_delegate.h" #include "chromeos/services/secure_channel/fake_connection_delegate.h"
#include "chromeos/services/secure_channel/fake_nearby_connection_manager.h"
#include "chromeos/services/secure_channel/fake_pending_connection_manager.h" #include "chromeos/services/secure_channel/fake_pending_connection_manager.h"
#include "chromeos/services/secure_channel/fake_timer_factory.h" #include "chromeos/services/secure_channel/fake_timer_factory.h"
#include "chromeos/services/secure_channel/nearby_connection_manager_impl.h"
#include "chromeos/services/secure_channel/pending_connection_manager_impl.h" #include "chromeos/services/secure_channel/pending_connection_manager_impl.h"
#include "chromeos/services/secure_channel/public/cpp/shared/connection_priority.h" #include "chromeos/services/secure_channel/public/cpp/shared/connection_priority.h"
#include "chromeos/services/secure_channel/public/mojom/secure_channel.mojom.h" #include "chromeos/services/secure_channel/public/mojom/secure_channel.mojom.h"
...@@ -236,13 +238,39 @@ class FakeBleConnectionManagerFactory ...@@ -236,13 +238,39 @@ class FakeBleConnectionManagerFactory
DISALLOW_COPY_AND_ASSIGN(FakeBleConnectionManagerFactory); DISALLOW_COPY_AND_ASSIGN(FakeBleConnectionManagerFactory);
}; };
class FakeNearbyConnectionManagerFactory
: public NearbyConnectionManagerImpl::Factory {
public:
FakeNearbyConnectionManagerFactory() = default;
~FakeNearbyConnectionManagerFactory() override = default;
FakeNearbyConnectionManager* instance() { return instance_; }
private:
// NearbyConnectionManagerImpl::Factory:
std::unique_ptr<NearbyConnectionManager> CreateInstance() override {
EXPECT_FALSE(instance_);
auto instance = std::make_unique<FakeNearbyConnectionManager>();
instance_ = instance.get();
return instance;
}
FakeNearbyConnectionManager* instance_ = nullptr;
DISALLOW_COPY_AND_ASSIGN(FakeNearbyConnectionManagerFactory);
};
class FakePendingConnectionManagerFactory class FakePendingConnectionManagerFactory
: public PendingConnectionManagerImpl::Factory { : public PendingConnectionManagerImpl::Factory {
public: public:
FakePendingConnectionManagerFactory( FakePendingConnectionManagerFactory(
FakeBleConnectionManagerFactory* fake_ble_connection_manager_factory) FakeBleConnectionManagerFactory* fake_ble_connection_manager_factory,
FakeNearbyConnectionManagerFactory*
fake_nearby_connection_manager_factory)
: fake_ble_connection_manager_factory_( : fake_ble_connection_manager_factory_(
fake_ble_connection_manager_factory) {} fake_ble_connection_manager_factory),
fake_nearby_connection_manager_factory_(
fake_nearby_connection_manager_factory) {}
~FakePendingConnectionManagerFactory() override = default; ~FakePendingConnectionManagerFactory() override = default;
...@@ -253,10 +281,13 @@ class FakePendingConnectionManagerFactory ...@@ -253,10 +281,13 @@ class FakePendingConnectionManagerFactory
std::unique_ptr<PendingConnectionManager> CreateInstance( std::unique_ptr<PendingConnectionManager> CreateInstance(
PendingConnectionManager::Delegate* delegate, PendingConnectionManager::Delegate* delegate,
BleConnectionManager* ble_connection_manager, BleConnectionManager* ble_connection_manager,
NearbyConnectionManager* nearby_connection_manager,
scoped_refptr<device::BluetoothAdapter> bluetooth_adapter) override { scoped_refptr<device::BluetoothAdapter> bluetooth_adapter) override {
EXPECT_FALSE(instance_); EXPECT_FALSE(instance_);
EXPECT_EQ(fake_ble_connection_manager_factory_->instance(), EXPECT_EQ(fake_ble_connection_manager_factory_->instance(),
ble_connection_manager); ble_connection_manager);
EXPECT_EQ(fake_nearby_connection_manager_factory_->instance(),
nearby_connection_manager);
auto instance = std::make_unique<FakePendingConnectionManager>(delegate); auto instance = std::make_unique<FakePendingConnectionManager>(delegate);
instance_ = instance.get(); instance_ = instance.get();
...@@ -264,6 +295,7 @@ class FakePendingConnectionManagerFactory ...@@ -264,6 +295,7 @@ class FakePendingConnectionManagerFactory
} }
FakeBleConnectionManagerFactory* fake_ble_connection_manager_factory_; FakeBleConnectionManagerFactory* fake_ble_connection_manager_factory_;
FakeNearbyConnectionManagerFactory* fake_nearby_connection_manager_factory_;
FakePendingConnectionManager* instance_ = nullptr; FakePendingConnectionManager* instance_ = nullptr;
...@@ -447,9 +479,15 @@ class SecureChannelServiceTest : public testing::Test { ...@@ -447,9 +479,15 @@ class SecureChannelServiceTest : public testing::Test {
BleConnectionManagerImpl::Factory::SetFactoryForTesting( BleConnectionManagerImpl::Factory::SetFactoryForTesting(
fake_ble_connection_manager_factory_.get()); fake_ble_connection_manager_factory_.get());
fake_nearby_connection_manager_factory_ =
std::make_unique<FakeNearbyConnectionManagerFactory>();
NearbyConnectionManagerImpl::Factory::SetFactoryForTesting(
fake_nearby_connection_manager_factory_.get());
fake_pending_connection_manager_factory_ = fake_pending_connection_manager_factory_ =
std::make_unique<FakePendingConnectionManagerFactory>( std::make_unique<FakePendingConnectionManagerFactory>(
fake_ble_connection_manager_factory_.get()); fake_ble_connection_manager_factory_.get(),
fake_nearby_connection_manager_factory_.get());
PendingConnectionManagerImpl::Factory::SetFactoryForTesting( PendingConnectionManagerImpl::Factory::SetFactoryForTesting(
fake_pending_connection_manager_factory_.get()); fake_pending_connection_manager_factory_.get());
...@@ -481,6 +519,7 @@ class SecureChannelServiceTest : public testing::Test { ...@@ -481,6 +519,7 @@ class SecureChannelServiceTest : public testing::Test {
BleSynchronizer::Factory::SetFactoryForTesting(nullptr); BleSynchronizer::Factory::SetFactoryForTesting(nullptr);
BleScannerImpl::Factory::SetFactoryForTesting(nullptr); BleScannerImpl::Factory::SetFactoryForTesting(nullptr);
BleConnectionManagerImpl::Factory::SetFactoryForTesting(nullptr); BleConnectionManagerImpl::Factory::SetFactoryForTesting(nullptr);
NearbyConnectionManagerImpl::Factory::SetFactoryForTesting(nullptr);
PendingConnectionManagerImpl::Factory::SetFactoryForTesting(nullptr); PendingConnectionManagerImpl::Factory::SetFactoryForTesting(nullptr);
ActiveConnectionManagerImpl::Factory::SetFactoryForTesting(nullptr); ActiveConnectionManagerImpl::Factory::SetFactoryForTesting(nullptr);
SecureChannelInitializer::Factory::SetFactoryForTesting(nullptr); SecureChannelInitializer::Factory::SetFactoryForTesting(nullptr);
...@@ -957,6 +996,8 @@ class SecureChannelServiceTest : public testing::Test { ...@@ -957,6 +996,8 @@ class SecureChannelServiceTest : public testing::Test {
std::unique_ptr<FakeBleScannerFactory> fake_ble_scanner_factory_; std::unique_ptr<FakeBleScannerFactory> fake_ble_scanner_factory_;
std::unique_ptr<FakeBleConnectionManagerFactory> std::unique_ptr<FakeBleConnectionManagerFactory>
fake_ble_connection_manager_factory_; fake_ble_connection_manager_factory_;
std::unique_ptr<FakeNearbyConnectionManagerFactory>
fake_nearby_connection_manager_factory_;
std::unique_ptr<FakePendingConnectionManagerFactory> std::unique_ptr<FakePendingConnectionManagerFactory>
fake_pending_connection_manager_factory_; fake_pending_connection_manager_factory_;
std::unique_ptr<FakeActiveConnectionManagerFactory> std::unique_ptr<FakeActiveConnectionManagerFactory>
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment