1 /*
2  *  Copyright 2021 The Android Open Source Project
3  *
4  *  Licensed under the Apache License, Version 2.0 (the "License");
5  *  you may not use this file except in compliance with the License.
6  *  You may obtain a copy of the License at:
7  *
8  *  http://www.apache.org/licenses/LICENSE-2.0
9  *
10  *  Unless required by applicable law or agreed to in writing, software
11  *  distributed under the License is distributed on an "AS IS" BASIS,
12  *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  *  See the License for the specific language governing permissions and
14  *  limitations under the License.
15  */
16 
17 #include <gmock/gmock.h>
18 #include <gtest/gtest.h>
19 
20 #include <cstring>
21 #include <utility>
22 
23 #include "stack/include/hcidefs.h"
24 #include "stack/include/l2cdefs.h"
25 #include "test/common/mock_functions.h"
26 
27 using testing::_;
28 using testing::DoAll;
29 using testing::NotNull;
30 using testing::Pointee;
31 using testing::Return;
32 using testing::SaveArg;
33 using testing::SaveArgPointee;
34 using testing::StrEq;
35 using testing::StrictMock;
36 using testing::Test;
37 
38 class StackHciTest : public Test {
39 public:
40 protected:
SetUp()41   void SetUp() override { reset_mock_function_count_map(); }
TearDown()42   void TearDown() override {}
43 };
44 
TEST_F(StackHciTest,hci_preamble)45 TEST_F(StackHciTest, hci_preamble) {
46   {
47     HciDataPreamble preamble;
48 
49     ASSERT_EQ(sizeof(preamble), HCI_DATA_PREAMBLE_SIZE);
50 
51     preamble.bits.handle = 0xfff;
52     preamble.bits.boundary = 0x3;
53     preamble.bits.broadcast = 0x1;
54     preamble.bits.unused15 = 0x0;
55     preamble.bits.length = 0xffff;
56 
57     ASSERT_EQ(0x7fff, preamble.raw.word0);
58     ASSERT_EQ(0xffff, preamble.raw.word1);
59 
60     const uint8_t exp[] = {0xff, 0x7f, 0xff, 0xff};
61     uint8_t act[sizeof(preamble)];
62     preamble.Serialize(act);
63     ASSERT_EQ(0, std::memcmp(exp, act, sizeof(preamble)));
64   }
65 
66   {
67     HciDataPreamble preamble;
68     preamble.raw.word0 = 0x123 | (L2CAP_PKT_START_NON_FLUSHABLE << L2CAP_PKT_TYPE_SHIFT);
69     preamble.raw.word1 = 0x4567;
70 
71     ASSERT_EQ(sizeof(preamble), HCI_DATA_PREAMBLE_SIZE);
72 
73     ASSERT_EQ(0x0123, preamble.raw.word0);
74     ASSERT_EQ(0x4567, preamble.raw.word1);
75 
76     const uint8_t exp[] = {0x23, 0x01, 0x67, 0x45};
77     uint8_t act[sizeof(preamble)];
78     preamble.Serialize(act);
79     ASSERT_EQ(0, std::memcmp(exp, act, sizeof(preamble)));
80   }
81   {
82     HciDataPreamble preamble;
83     preamble.raw.word0 = 0x123 | (L2CAP_PKT_START << L2CAP_PKT_TYPE_SHIFT);
84     preamble.raw.word1 = 0x4567;
85 
86     ASSERT_EQ(sizeof(preamble), HCI_DATA_PREAMBLE_SIZE);
87 
88     ASSERT_EQ(0x2123, preamble.raw.word0);
89     ASSERT_EQ(0x4567, preamble.raw.word1);
90 
91     const uint8_t exp[] = {0x23, 0x21, 0x67, 0x45};
92     uint8_t act[sizeof(preamble)];
93     preamble.Serialize(act);
94     ASSERT_EQ(0, std::memcmp(exp, act, sizeof(preamble)));
95   }
96 
97   {
98     HciDataPreamble preamble;
99     preamble.raw.word0 = 0x0 | (L2CAP_PKT_START << L2CAP_PKT_TYPE_SHIFT);
100     preamble.raw.word1 = 0x0;
101 
102     ASSERT_EQ(sizeof(preamble), HCI_DATA_PREAMBLE_SIZE);
103 
104     ASSERT_EQ(0x2000, preamble.raw.word0);
105     ASSERT_EQ(0x0000, preamble.raw.word1);
106 
107     const uint8_t exp[] = {0x00, 0x20, 0x00, 0x00};
108     uint8_t act[sizeof(preamble)];
109     preamble.Serialize(act);
110     ASSERT_EQ(0, std::memcmp(exp, act, sizeof(preamble)));
111   }
112 
113   {
114     HciDataPreamble preamble;
115     preamble.raw.word0 = 0x0 | (L2CAP_PKT_START << L2CAP_PKT_TYPE_SHIFT);
116     preamble.raw.word1 = 0x0;
117 
118     ASSERT_TRUE(preamble.IsFlushable());
119 
120     preamble.raw.word0 = 0x0 | (L2CAP_PKT_START << L2CAP_PKT_START_NON_FLUSHABLE);
121     ASSERT_TRUE(!preamble.IsFlushable());
122   }
123 }
124 
TEST_F(StackHciTest,hci_error_code_text)125 TEST_F(StackHciTest, hci_error_code_text) {
126   std::vector<std::pair<tHCI_ERROR_CODE, std::string>> errors = {
127           std::make_pair(HCI_SUCCESS, "HCI_SUCCESS"),
128           std::make_pair(HCI_ERR_ILLEGAL_COMMAND, "HCI_ERR_ILLEGAL_COMMAND"),
129           std::make_pair(HCI_ERR_NO_CONNECTION, "HCI_ERR_NO_CONNECTION"),
130           std::make_pair(HCI_ERR_HW_FAILURE, "HCI_ERR_HW_FAILURE"),
131           std::make_pair(HCI_ERR_PAGE_TIMEOUT, "HCI_ERR_PAGE_TIMEOUT"),
132           std::make_pair(HCI_ERR_AUTH_FAILURE, "HCI_ERR_AUTH_FAILURE"),
133           std::make_pair(HCI_ERR_KEY_MISSING, "HCI_ERR_KEY_MISSING"),
134           std::make_pair(HCI_ERR_MEMORY_FULL, "HCI_ERR_MEMORY_FULL"),
135           std::make_pair(HCI_ERR_CONNECTION_TOUT, "HCI_ERR_CONNECTION_TOUT"),
136           std::make_pair(HCI_ERR_MAX_NUM_OF_CONNECTIONS, "HCI_ERR_MAX_NUM_OF_CONNECTIONS"),
137           std::make_pair(HCI_ERR_MAX_NUM_OF_SCOS, "HCI_ERR_MAX_NUM_OF_SCOS"),
138           std::make_pair(HCI_ERR_CONNECTION_EXISTS, "HCI_ERR_CONNECTION_EXISTS"),
139           std::make_pair(HCI_ERR_COMMAND_DISALLOWED, "HCI_ERR_COMMAND_DISALLOWED"),
140           std::make_pair(HCI_ERR_HOST_REJECT_RESOURCES, "HCI_ERR_HOST_REJECT_RESOURCES"),
141           std::make_pair(HCI_ERR_HOST_REJECT_SECURITY, "HCI_ERR_HOST_REJECT_SECURITY"),
142           std::make_pair(HCI_ERR_HOST_REJECT_DEVICE, "HCI_ERR_HOST_REJECT_DEVICE"),
143           std::make_pair(HCI_ERR_HOST_TIMEOUT, "HCI_ERR_HOST_TIMEOUT"),
144           std::make_pair(HCI_ERR_ILLEGAL_PARAMETER_FMT, "HCI_ERR_ILLEGAL_PARAMETER_FMT"),
145           std::make_pair(HCI_ERR_PEER_USER, "HCI_ERR_PEER_USER"),
146           std::make_pair(HCI_ERR_REMOTE_LOW_RESOURCE, "HCI_ERR_REMOTE_LOW_RESOURCE"),
147           std::make_pair(HCI_ERR_REMOTE_POWER_OFF, "HCI_ERR_REMOTE_POWER_OFF"),
148           std::make_pair(HCI_ERR_CONN_CAUSE_LOCAL_HOST, "HCI_ERR_CONN_CAUSE_LOCAL_HOST"),
149           std::make_pair(HCI_ERR_REPEATED_ATTEMPTS, "HCI_ERR_REPEATED_ATTEMPTS"),
150           std::make_pair(HCI_ERR_PAIRING_NOT_ALLOWED, "HCI_ERR_PAIRING_NOT_ALLOWED"),
151           std::make_pair(HCI_ERR_UNSUPPORTED_REM_FEATURE, "HCI_ERR_UNSUPPORTED_REM_FEATURE"),
152           std::make_pair(HCI_ERR_UNSPECIFIED, "HCI_ERR_UNSPECIFIED"),
153           std::make_pair(HCI_ERR_LMP_RESPONSE_TIMEOUT, "HCI_ERR_LMP_RESPONSE_TIMEOUT"),
154           std::make_pair(HCI_ERR_LMP_ERR_TRANS_COLLISION, "HCI_ERR_LMP_ERR_TRANS_COLLISION"),
155           std::make_pair(HCI_ERR_ENCRY_MODE_NOT_ACCEPTABLE, "HCI_ERR_ENCRY_MODE_NOT_ACCEPTABLE"),
156           std::make_pair(HCI_ERR_UNIT_KEY_USED, "HCI_ERR_UNIT_KEY_USED"),
157           std::make_pair(HCI_ERR_PAIRING_WITH_UNIT_KEY_NOT_SUPPORTED,
158                          "HCI_ERR_PAIRING_WITH_UNIT_KEY_NOT_SUPPORTED"),
159           std::make_pair(HCI_ERR_DIFF_TRANSACTION_COLLISION, "HCI_ERR_DIFF_TRANSACTION_COLLISION"),
160           std::make_pair(HCI_ERR_INSUFFCIENT_SECURITY, "HCI_ERR_INSUFFCIENT_SECURITY"),
161           std::make_pair(HCI_ERR_ROLE_SWITCH_PENDING, "HCI_ERR_ROLE_SWITCH_PENDING"),
162           std::make_pair(HCI_ERR_ROLE_SWITCH_FAILED, "HCI_ERR_ROLE_SWITCH_FAILED"),
163           std::make_pair(HCI_ERR_HOST_BUSY_PAIRING, "HCI_ERR_HOST_BUSY_PAIRING"),
164           std::make_pair(HCI_ERR_UNACCEPT_CONN_INTERVAL, "HCI_ERR_UNACCEPT_CONN_INTERVAL"),
165           std::make_pair(HCI_ERR_ADVERTISING_TIMEOUT, "HCI_ERR_ADVERTISING_TIMEOUT"),
166           std::make_pair(HCI_ERR_CONN_FAILED_ESTABLISHMENT, "HCI_ERR_CONN_FAILED_ESTABLISHMENT"),
167           std::make_pair(HCI_ERR_LIMIT_REACHED, "HCI_ERR_LIMIT_REACHED"),
168   };
169   for (const auto& error : errors) {
170     ASSERT_STREQ(error.second.c_str(), hci_error_code_text(error.first).c_str());
171   }
172   for (const auto& error : errors) {
173     ASSERT_STREQ(error.second.c_str(), hci_error_code_text(error.first).c_str());
174   }
175   auto unknown = base::StringPrintf("UNKNOWN[0x%02hx]", std::numeric_limits<std::uint8_t>::max());
176   ASSERT_STREQ(unknown.c_str(),
177                hci_error_code_text(
178                        static_cast<tHCI_ERROR_CODE>(std::numeric_limits<std::uint8_t>::max()))
179                        .c_str());
180 }
181