1 // Copyright 2023 The Pigweed Authors 2 // 3 // Licensed under the Apache License, Version 2.0 (the "License"); you may not 4 // use this file except in compliance with the License. You may obtain a copy of 5 // the License at 6 // 7 // https://www.apache.org/licenses/LICENSE-2.0 8 // 9 // Unless required by applicable law or agreed to in writing, software 10 // distributed under the License is distributed on an "AS IS" BASIS, WITHOUT 11 // WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the 12 // License for the specific language governing permissions and limitations under 13 // the License. 14 15 #pragma once 16 #include "pw_bluetooth_sapphire/internal/host/sm/pairing_phase.h" 17 #include "pw_unit_test/framework.h" 18 19 namespace bt::sm { 20 21 class FakeListener : public PairingPhase::Listener { 22 public: FakeListener()23 FakeListener() : weak_self_(this) {} 24 ~FakeListener() override = default; 25 26 // PairingPhase::Listener override: OnIdentityRequest()27 std::optional<IdentityInfo> OnIdentityRequest() override { 28 identity_info_count_++; 29 return identity_info_; 30 } 31 32 // PairingPhase::Listener override. Confirms pairing even without a delegate 33 // present so that the simplest pairing flows (JustWorks) work with minimal 34 // configuration. ConfirmPairing(ConfirmCallback confirm)35 void ConfirmPairing(ConfirmCallback confirm) override { 36 if (confirm_delegate_) { 37 confirm_delegate_(std::move(confirm)); 38 } else { 39 confirm(true); 40 } 41 } 42 43 // PairingPhase::Listener override: DisplayPasskey(uint32_t passkey,Delegate::DisplayMethod method,ConfirmCallback confirm)44 void DisplayPasskey(uint32_t passkey, 45 Delegate::DisplayMethod method, 46 ConfirmCallback confirm) override { 47 if (display_delegate_) { 48 display_delegate_(passkey, method, std::move(confirm)); 49 } else { 50 ADD_FAILURE() << "No passkey display delegate set for pairing"; 51 } 52 } 53 54 // PairingPhase::Listener override: RequestPasskey(PasskeyResponseCallback respond)55 void RequestPasskey(PasskeyResponseCallback respond) override { 56 if (request_passkey_delegate_) { 57 request_passkey_delegate_(std::move(respond)); 58 } else { 59 ADD_FAILURE() 60 << "No passkey entry delegate set for passkey entry pairing"; 61 } 62 } 63 64 // PairingPhase::Listener override: OnPairingFailed(Error error)65 void OnPairingFailed(Error error) override { 66 pairing_error_count_++; 67 last_error_ = error; 68 } 69 as_weak_ptr()70 PairingPhase::Listener::WeakPtr as_weak_ptr() { 71 return weak_self_.GetWeakPtr(); 72 } 73 set_identity_info(std::optional<IdentityInfo> value)74 void set_identity_info(std::optional<IdentityInfo> value) { 75 identity_info_ = value; 76 } identity_info_count()77 int identity_info_count() const { return identity_info_count_; } 78 79 using ConfirmDelegate = fit::function<void(ConfirmCallback)>; set_confirm_delegate(ConfirmDelegate delegate)80 void set_confirm_delegate(ConfirmDelegate delegate) { 81 confirm_delegate_ = std::move(delegate); 82 } 83 84 using DisplayDelegate = 85 fit::function<void(uint32_t, Delegate::DisplayMethod, ConfirmCallback)>; set_display_delegate(DisplayDelegate delegate)86 void set_display_delegate(DisplayDelegate delegate) { 87 display_delegate_ = std::move(delegate); 88 } 89 90 // sm::Delegate override: 91 using RequestPasskeyDelegate = fit::function<void(PasskeyResponseCallback)>; set_request_passkey_delegate(RequestPasskeyDelegate delegate)92 void set_request_passkey_delegate(RequestPasskeyDelegate delegate) { 93 request_passkey_delegate_ = std::move(delegate); 94 } 95 pairing_error_count()96 int pairing_error_count() const { return pairing_error_count_; } last_error()97 const std::optional<Error>& last_error() const { return last_error_; } 98 99 private: 100 std::optional<IdentityInfo> identity_info_ = std::nullopt; 101 int identity_info_count_ = 0; 102 103 // Delegate functions used to respond to user input requests from the pairing 104 // phases. 105 ConfirmDelegate confirm_delegate_; 106 DisplayDelegate display_delegate_; 107 RequestPasskeyDelegate request_passkey_delegate_; 108 109 int pairing_error_count_ = 0; 110 std::optional<Error> last_error_; 111 112 WeakSelf<PairingPhase::Listener> weak_self_; 113 }; 114 115 } // namespace bt::sm 116