blob: 136ead6d549a0b3dccfc7fec0b29a59974ff91f2 [file] [log] [blame]
// Copyright 2020 The Fuchsia Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef SRC_CONNECTIVITY_BLUETOOTH_CORE_BT_HOST_SM_FAKE_PHASE_LISTENER_H_
#define SRC_CONNECTIVITY_BLUETOOTH_CORE_BT_HOST_SM_FAKE_PHASE_LISTENER_H_
#include <gtest/gtest.h>
#include "src/connectivity/bluetooth/core/bt-host/sm/pairing_phase.h"
#include "src/lib/fxl/memory/weak_ptr.h"
namespace bt::sm {
class FakeListener : public PairingPhase::Listener {
public:
FakeListener() : weak_ptr_factory_(this) {}
~FakeListener() override = default;
// PairingPhase::Listener override:
std::optional<IdentityInfo> OnIdentityRequest() override {
identity_info_count_++;
return identity_info_;
}
// PairingPhase::Listener override. Confirms pairing even without a delegate present so that the
// simplest pairing flows (JustWorks) work with minimal configuration.
void ConfirmPairing(ConfirmCallback confirm) override {
if (confirm_delegate_) {
confirm_delegate_(std::move(confirm));
} else {
confirm(true);
}
}
// PairingPhase::Listener override:
void DisplayPasskey(uint32_t passkey, Delegate::DisplayMethod method,
ConfirmCallback confirm) override {
if (display_delegate_) {
display_delegate_(passkey, method, std::move(confirm));
} else {
ADD_FAILURE() << "No passkey display delegate set for pairing";
}
}
// PairingPhase::Listener override:
void RequestPasskey(PasskeyResponseCallback respond) override {
if (request_passkey_delegate_) {
request_passkey_delegate_(std::move(respond));
} else {
ADD_FAILURE() << "No passkey entry delegate set for passkey entry pairing";
}
}
// PairingPhase::Listener override:
void OnPairingFailed(Error error) override {
pairing_error_count_++;
last_error_ = error;
}
fxl::WeakPtr<PairingPhase::Listener> as_weak_ptr() { return weak_ptr_factory_.GetWeakPtr(); }
void set_identity_info(std::optional<IdentityInfo> value) { identity_info_ = value; }
int identity_info_count() const { return identity_info_count_; }
using ConfirmDelegate = fit::function<void(ConfirmCallback)>;
void set_confirm_delegate(ConfirmDelegate delegate) { confirm_delegate_ = std::move(delegate); }
using DisplayDelegate = fit::function<void(uint32_t, Delegate::DisplayMethod, ConfirmCallback)>;
void set_display_delegate(DisplayDelegate delegate) { display_delegate_ = std::move(delegate); }
// sm::Delegate override:
using RequestPasskeyDelegate = fit::function<void(PasskeyResponseCallback)>;
void set_request_passkey_delegate(RequestPasskeyDelegate delegate) {
request_passkey_delegate_ = std::move(delegate);
}
int pairing_error_count() const { return pairing_error_count_; }
const std::optional<Error>& last_error() const { return last_error_; }
private:
std::optional<IdentityInfo> identity_info_ = std::nullopt;
int identity_info_count_ = 0;
// Delegate functions used to respond to user input requests from the pairing phases.
ConfirmDelegate confirm_delegate_;
DisplayDelegate display_delegate_;
RequestPasskeyDelegate request_passkey_delegate_;
int pairing_error_count_ = 0;
std::optional<Error> last_error_;
fxl::WeakPtrFactory<FakeListener> weak_ptr_factory_;
};
} // namespace bt::sm
#endif // SRC_CONNECTIVITY_BLUETOOTH_CORE_BT_HOST_SM_FAKE_PHASE_LISTENER_H_