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 #include "pw_bluetooth_sapphire/internal/host/gap/fake_pairing_delegate.h"
16
17 #include "pw_bluetooth_sapphire/internal/host/testing/test_helpers.h"
18 #include "pw_unit_test/framework.h"
19
20 namespace bt::gap {
21 namespace {
22
TEST(FakePairingDelegateTest,io_capability)23 TEST(FakePairingDelegateTest, io_capability) {
24 FakePairingDelegate delegate(sm::IOCapability::kDisplayYesNo);
25 EXPECT_EQ(sm::IOCapability::kDisplayYesNo, delegate.io_capability());
26 delegate.set_io_capability(sm::IOCapability::kNoInputNoOutput);
27 EXPECT_EQ(sm::IOCapability::kNoInputNoOutput, delegate.io_capability());
28 }
29
TEST(FakePairingDelegateTest,CompletePairing)30 TEST(FakePairingDelegateTest, CompletePairing) {
31 FakePairingDelegate delegate(sm::IOCapability::kDisplayYesNo);
32
33 bool cb_called = false;
34 auto cb = [&cb_called](auto id, auto status) {
35 cb_called = true;
36 EXPECT_EQ(PeerId(5), id);
37 EXPECT_EQ(ToResult(HostError::kFailed), status);
38 };
39 delegate.SetCompletePairingCallback(std::move(cb));
40 delegate.CompletePairing(PeerId(5), ToResult(HostError::kFailed));
41 EXPECT_TRUE(cb_called);
42 }
43
TEST(FakePairingDelegateTest,ConfirmPairing)44 TEST(FakePairingDelegateTest, ConfirmPairing) {
45 FakePairingDelegate delegate(sm::IOCapability::kDisplayYesNo);
46
47 bool cb_called = false;
48 auto cb = [&cb_called](auto id, auto confirm) {
49 cb_called = true;
50 EXPECT_EQ(PeerId(5), id);
51 ASSERT_TRUE(confirm);
52 confirm(true);
53 };
54 delegate.SetConfirmPairingCallback(std::move(cb));
55 delegate.ConfirmPairing(PeerId(5), [](bool) {});
56 EXPECT_TRUE(cb_called);
57 }
58
TEST(FakePairingDelegateTest,DisplayPasskey)59 TEST(FakePairingDelegateTest, DisplayPasskey) {
60 FakePairingDelegate delegate(sm::IOCapability::kDisplayYesNo);
61
62 bool cb_called = false;
63 auto cb = [&cb_called](auto id, auto passkey, auto method, auto confirm) {
64 cb_called = true;
65 EXPECT_EQ(PeerId(5), id);
66 EXPECT_EQ(123456U, passkey);
67 EXPECT_EQ(PairingDelegate::DisplayMethod::kComparison, method);
68 ASSERT_TRUE(confirm);
69 confirm(true);
70 };
71 delegate.SetDisplayPasskeyCallback(std::move(cb));
72 delegate.DisplayPasskey(
73 PeerId(5), 123456, PairingDelegate::DisplayMethod::kComparison, [](bool) {
74 });
75 EXPECT_TRUE(cb_called);
76 }
77
TEST(FakePairingDelegateTest,RequestPasskey)78 TEST(FakePairingDelegateTest, RequestPasskey) {
79 FakePairingDelegate delegate(sm::IOCapability::kDisplayYesNo);
80
81 bool cb_called = false;
82 auto cb = [&cb_called](auto id, auto respond) {
83 cb_called = true;
84 EXPECT_EQ(PeerId(5), id);
85 ASSERT_TRUE(respond);
86 respond(-1);
87 };
88 delegate.SetRequestPasskeyCallback(std::move(cb));
89 delegate.RequestPasskey(PeerId(5), [](uint64_t) {});
90 EXPECT_TRUE(cb_called);
91 }
92
TEST(FakePairingDelegateTest,UnexpectedCalls)93 TEST(FakePairingDelegateTest, UnexpectedCalls) {
94 FakePairingDelegate delegate(sm::IOCapability::kDisplayYesNo);
95
96 // Each of the following calls should generate failure(s).
97 // delegate.CompletePairing(PeerId(5), ToResult(HostError::kFailed));
98 // delegate.ConfirmPairing(PeerId(5), [](bool) {});
99 // delegate.DisplayPasskey(PeerId(5), 123456,
100 // PairingDelegate::DisplayMethod::kComparison,
101 // [](bool) {});
102 // delegate.RequestPasskey(PeerId(5), [](uint64_t) {});
103 }
104
TEST(FakePairingDelegateTest,ExpectCallNotCalled)105 TEST(FakePairingDelegateTest, ExpectCallNotCalled) {
106 FakePairingDelegate delegate(sm::IOCapability::kDisplayYesNo);
107
108 // delegate.SetCompletePairingCallback([](auto, auto) {});
109 // delegate.SetConfirmPairingCallback([](auto, auto) {});
110 // delegate.SetDisplayPasskeyCallback([](auto, auto, auto, auto) {});
111 // delegate.SetRequestPasskeyCallback([](auto, auto) {});
112 // Each of the preceding calls should generate failure(s) when |delegate| goes
113 // out of scope.
114 }
115
116 } // namespace
117 } // namespace bt::gap
118