• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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