1 //
2 // Copyright (C) 2025 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 "nfa_hci_main.cc"
18
19 #include <gmock/gmock.h>
20 #include <gtest/gtest.h>
21
22 #include "mock_gki_utils.h"
23 #include "nfa_sys_main.cc"
24 #include "nfc_main.cc"
25
ResetNfaHciCb()26 void ResetNfaHciCb() {
27 nfa_hci_cb.msg_len = 0;
28 nfa_hci_cb.assembly_failed = false;
29 memset(nfa_hci_cb.p_msg_data, 0, nfa_hci_cb.max_msg_len);
30 }
31
32 class NfaHciAssembleMsgTest : public testing::Test {
33 protected:
SetUp()34 void SetUp() override {
35 nfa_hci_cb.max_msg_len = 1024;
36 nfa_hci_cb.p_msg_data = new uint8_t[nfa_hci_cb.max_msg_len];
37 ResetNfaHciCb();
38 }
TearDown()39 void TearDown() override {
40 delete[] nfa_hci_cb.p_msg_data;
41 }
42 };
43
TEST_F(NfaHciAssembleMsgTest,NormalReassembly)44 TEST_F(NfaHciAssembleMsgTest, NormalReassembly) {
45 uint8_t test_data[] = {0x01, 0x02, 0x03};
46 uint16_t data_len = sizeof(test_data);
47 nfa_hci_assemble_msg(test_data, data_len);
48 EXPECT_EQ(nfa_hci_cb.msg_len, data_len);
49 EXPECT_FALSE(nfa_hci_cb.assembly_failed);
50 EXPECT_EQ(memcmp(nfa_hci_cb.p_msg_data, test_data, data_len), 0);
51 }
52
TEST_F(NfaHciAssembleMsgTest,BufferOverflow)53 TEST_F(NfaHciAssembleMsgTest, BufferOverflow) {
54 uint8_t test_data[] = {0xFF, 0xEE, 0xDD, 0xCC};
55 uint16_t data_len = nfa_hci_cb.max_msg_len + 10;
56 nfa_hci_assemble_msg(test_data, data_len);
57 EXPECT_EQ(nfa_hci_cb.msg_len, nfa_hci_cb.max_msg_len);
58 EXPECT_TRUE(nfa_hci_cb.assembly_failed);
59 }
60
TEST_F(NfaHciAssembleMsgTest,PartialReassembly)61 TEST_F(NfaHciAssembleMsgTest, PartialReassembly) {
62 uint8_t test_data[] = {0xAA, 0xBB, 0xCC};
63 nfa_hci_cb.msg_len = nfa_hci_cb.max_msg_len - 1;
64 nfa_hci_assemble_msg(test_data, sizeof(test_data));
65 EXPECT_EQ(nfa_hci_cb.msg_len, nfa_hci_cb.max_msg_len);
66 EXPECT_TRUE(nfa_hci_cb.assembly_failed);
67 EXPECT_EQ(nfa_hci_cb.p_msg_data[nfa_hci_cb.max_msg_len - 1], 0xAA);
68 }
69
TEST_F(NfaHciAssembleMsgTest,EmptyData)70 TEST_F(NfaHciAssembleMsgTest, EmptyData) {
71 uint8_t* test_data = nullptr;
72 uint16_t data_len = 0;
73 nfa_hci_assemble_msg(test_data, data_len);
74 EXPECT_EQ(nfa_hci_cb.msg_len, 0);
75 EXPECT_FALSE(nfa_hci_cb.assembly_failed);
76 }
77
TEST_F(NfaHciAssembleMsgTest,AppendToExistingData)78 TEST_F(NfaHciAssembleMsgTest, AppendToExistingData) {
79 uint8_t initial_data[] = {0x11, 0x22};
80 uint8_t new_data[] = {0x33, 0x44};
81 memcpy(nfa_hci_cb.p_msg_data, initial_data, sizeof(initial_data));
82 nfa_hci_cb.msg_len = sizeof(initial_data);
83 nfa_hci_assemble_msg(new_data, sizeof(new_data));
84 EXPECT_EQ(nfa_hci_cb.msg_len, sizeof(initial_data) + sizeof(new_data));
85 EXPECT_FALSE(nfa_hci_cb.assembly_failed);
86 EXPECT_EQ(memcmp(nfa_hci_cb.p_msg_data, initial_data, sizeof(initial_data)), 0);
87 EXPECT_EQ(memcmp(nfa_hci_cb.p_msg_data + sizeof(initial_data), new_data, sizeof(new_data)), 0);
88 }
89
90 class NfaHciIsValidCfgTest : public testing::Test {
91 protected:
SetUp()92 void SetUp() override {
93 memset(&nfa_hci_cb, 0, sizeof(nfa_hci_cb));
94 }
95 };
96
TEST_F(NfaHciIsValidCfgTest,ValidConfiguration)97 TEST_F(NfaHciIsValidCfgTest, ValidConfiguration) {
98 strncpy(nfa_hci_cb.cfg.reg_app_names[0], "App1", NFA_MAX_HCI_APP_NAME_LEN);
99 nfa_hci_cb.cfg.b_send_conn_evts[0] = true;
100 nfa_hci_cb.cfg.dyn_gates[0].gate_id = NFA_HCI_LOOP_BACK_GATE;
101 nfa_hci_cb.cfg.dyn_gates[0].pipe_inx_mask = 0x01;
102 nfa_hci_cb.cfg.dyn_gates[0].gate_owner = 0;
103 nfa_hci_cb.cfg.dyn_pipes[0].pipe_id = NFA_HCI_FIRST_DYNAMIC_PIPE;
104 nfa_hci_cb.cfg.dyn_pipes[0].pipe_state = NFA_HCI_PIPE_OPENED;
105 nfa_hci_cb.cfg.dyn_pipes[0].local_gate = NFA_HCI_LOOP_BACK_GATE;
106 nfa_hci_cb.cfg.dyn_pipes[0].dest_gate = NFA_HCI_LOOP_BACK_GATE;
107 nfa_hci_cb.cfg.admin_gate.pipe01_state = NFA_HCI_PIPE_OPENED;
108 nfa_hci_cb.cfg.link_mgmt_gate.pipe00_state = NFA_HCI_PIPE_OPENED;
109 nfa_hci_cb.cfg.id_mgmt_gate.pipe_inx_mask = 0x01;
110 EXPECT_FALSE(nfa_hci_is_valid_cfg());
111 }
112
TEST_F(NfaHciIsValidCfgTest,InvalidAppNameLength)113 TEST_F(NfaHciIsValidCfgTest, InvalidAppNameLength) {
114 memset(nfa_hci_cb.cfg.reg_app_names[0], 'A', NFA_MAX_HCI_APP_NAME_LEN + 1);
115 EXPECT_FALSE(nfa_hci_is_valid_cfg());
116 }
117
TEST_F(NfaHciIsValidCfgTest,DuplicateAppNames)118 TEST_F(NfaHciIsValidCfgTest, DuplicateAppNames) {
119 strncpy(nfa_hci_cb.cfg.reg_app_names[0], "App1", NFA_MAX_HCI_APP_NAME_LEN);
120 strncpy(nfa_hci_cb.cfg.reg_app_names[1], "App1", NFA_MAX_HCI_APP_NAME_LEN);
121 EXPECT_FALSE(nfa_hci_is_valid_cfg());
122 }
123
TEST_F(NfaHciIsValidCfgTest,InvalidConnectivityEventFlag)124 TEST_F(NfaHciIsValidCfgTest, InvalidConnectivityEventFlag) {
125 strncpy(nfa_hci_cb.cfg.reg_app_names[0], "App1", NFA_MAX_HCI_APP_NAME_LEN);
126 nfa_hci_cb.cfg.b_send_conn_evts[0] = 2; // Invalid value
127 EXPECT_TRUE(nfa_hci_is_valid_cfg());
128 }
129
TEST_F(NfaHciIsValidCfgTest,InvalidGateId)130 TEST_F(NfaHciIsValidCfgTest, InvalidGateId) {
131 nfa_hci_cb.cfg.dyn_gates[0].gate_id = 0xFF;
132 EXPECT_TRUE(nfa_hci_is_valid_cfg());
133 }
134
TEST_F(NfaHciIsValidCfgTest,DuplicateGateIds)135 TEST_F(NfaHciIsValidCfgTest, DuplicateGateIds) {
136 nfa_hci_cb.cfg.dyn_gates[0].gate_id = NFA_HCI_LOOP_BACK_GATE;
137 nfa_hci_cb.cfg.dyn_gates[1].gate_id = NFA_HCI_LOOP_BACK_GATE;
138 EXPECT_FALSE(nfa_hci_is_valid_cfg());
139 }
140
TEST_F(NfaHciIsValidCfgTest,InvalidPipeState)141 TEST_F(NfaHciIsValidCfgTest, InvalidPipeState) {
142 nfa_hci_cb.cfg.dyn_pipes[0].pipe_id = NFA_HCI_FIRST_DYNAMIC_PIPE;
143 nfa_hci_cb.cfg.dyn_pipes[0].pipe_state = 0xFF;
144 EXPECT_FALSE(nfa_hci_is_valid_cfg());
145 }
146
TEST_F(NfaHciIsValidCfgTest,InvalidAdminGatePipeState)147 TEST_F(NfaHciIsValidCfgTest, InvalidAdminGatePipeState) {
148 nfa_hci_cb.cfg.admin_gate.pipe01_state = 0xFF;
149 EXPECT_FALSE(nfa_hci_is_valid_cfg());
150 }
151
TEST_F(NfaHciIsValidCfgTest,InvalidLinkMgmtGatePipeState)152 TEST_F(NfaHciIsValidCfgTest, InvalidLinkMgmtGatePipeState) {
153 nfa_hci_cb.cfg.link_mgmt_gate.pipe00_state = 0xFF;
154 EXPECT_FALSE(nfa_hci_is_valid_cfg());
155 }
156
TEST_F(NfaHciIsValidCfgTest,InvalidPipeInIdentityManagementGate)157 TEST_F(NfaHciIsValidCfgTest, InvalidPipeInIdentityManagementGate) {
158 nfa_hci_cb.cfg.id_mgmt_gate.pipe_inx_mask = 0x01;
159 nfa_hci_cb.cfg.dyn_pipes[0].pipe_id = NFA_HCI_FIRST_DYNAMIC_PIPE;
160 nfa_hci_cb.cfg.dyn_pipes[0].local_gate = 0xFF;
161 EXPECT_FALSE(nfa_hci_is_valid_cfg());
162 }
163
TEST_F(NfaHciIsValidCfgTest,DuplicatePipeIds)164 TEST_F(NfaHciIsValidCfgTest, DuplicatePipeIds) {
165 nfa_hci_cb.cfg.dyn_pipes[0].pipe_id = NFA_HCI_FIRST_DYNAMIC_PIPE;
166 nfa_hci_cb.cfg.dyn_pipes[1].pipe_id = NFA_HCI_FIRST_DYNAMIC_PIPE;
167 EXPECT_FALSE(nfa_hci_is_valid_cfg());
168 }
169
170 class NfaHciProcNfccPowerModeTest : public testing::Test {
171 protected:
SetUp()172 void SetUp() override {
173 memset(&nfa_hci_cb, 0, sizeof(nfa_hci_cb));
174 }
175 };
176
TEST_F(NfaHciProcNfccPowerModeTest,FullPowerModeWhenIdle)177 TEST_F(NfaHciProcNfccPowerModeTest, FullPowerModeWhenIdle) {
178 nfa_hci_cb.hci_state = NFA_HCI_STATE_IDLE;
179 nfa_hci_cb.num_nfcee = 1;
180 nfa_hci_proc_nfcc_power_mode(NFA_DM_PWR_MODE_FULL);
181 EXPECT_EQ(nfa_hci_cb.b_low_power_mode, false);
182 EXPECT_EQ(nfa_hci_cb.hci_state, NFA_HCI_STATE_RESTORE);
183 EXPECT_EQ(nfa_hci_cb.ee_disc_cmplt, false);
184 EXPECT_EQ(nfa_hci_cb.ee_disable_disc, true);
185 EXPECT_EQ(nfa_hci_cb.w4_hci_netwk_init, false);
186 EXPECT_EQ(nfa_hci_cb.conn_id, 0);
187 EXPECT_EQ(nfa_hci_cb.num_ee_dis_req_ntf, 0);
188 EXPECT_EQ(nfa_hci_cb.num_hot_plug_evts, 0);
189 }
190
TEST_F(NfaHciProcNfccPowerModeTest,FullPowerModeWhenNotIdle)191 TEST_F(NfaHciProcNfccPowerModeTest, FullPowerModeWhenNotIdle) {
192 nfa_hci_cb.hci_state = NFA_HCI_STATE_RESTORE;
193 nfa_hci_proc_nfcc_power_mode(NFA_DM_PWR_MODE_FULL);
194 }
195
TEST_F(NfaHciProcNfccPowerModeTest,NonFullPowerMode)196 TEST_F(NfaHciProcNfccPowerModeTest, NonFullPowerMode) {
197 nfa_hci_cb.hci_state = NFA_HCI_STATE_IDLE;
198 nfa_hci_cb.num_nfcee = 1;
199 nfa_hci_proc_nfcc_power_mode(0);
200 EXPECT_EQ(nfa_hci_cb.hci_state, NFA_HCI_STATE_IDLE);
201 EXPECT_EQ(nfa_hci_cb.w4_rsp_evt, false);
202 EXPECT_EQ(nfa_hci_cb.conn_id, 0);
203 EXPECT_EQ(nfa_hci_cb.b_low_power_mode, true);
204 }
205
TEST_F(NfaHciProcNfccPowerModeTest,FullPowerModeWhenMultipleNfcee)206 TEST_F(NfaHciProcNfccPowerModeTest, FullPowerModeWhenMultipleNfcee) {
207 nfa_hci_cb.hci_state = NFA_HCI_STATE_IDLE;
208 nfa_hci_cb.num_nfcee = 2;
209 nfa_hci_proc_nfcc_power_mode(NFA_DM_PWR_MODE_FULL);
210 EXPECT_EQ(nfa_hci_cb.w4_hci_netwk_init, true);
211 }
212
TEST_F(NfaHciProcNfccPowerModeTest,FullPowerModeWhenSingleNfcee)213 TEST_F(NfaHciProcNfccPowerModeTest, FullPowerModeWhenSingleNfcee) {
214 nfa_hci_cb.hci_state = NFA_HCI_STATE_IDLE;
215 nfa_hci_cb.num_nfcee = 1;
216 nfa_hci_proc_nfcc_power_mode(NFA_DM_PWR_MODE_FULL);
217 EXPECT_EQ(nfa_hci_cb.w4_hci_netwk_init, false);
218 }
219
220 class NfaHciRspTimeoutTest : public ::testing::Test {
221 protected:
SetUp()222 void SetUp() override {
223 memset(&nfa_hci_cb, 0, sizeof(nfa_hci_cb));
224 }
225 };
226
TEST_F(NfaHciRspTimeoutTest,TestStartupState)227 TEST_F(NfaHciRspTimeoutTest, TestStartupState) {
228 nfa_hci_cb.hci_state = NFA_HCI_STATE_STARTUP;
229 nfa_hci_rsp_timeout();
230 ASSERT_EQ(nfa_hci_cb.hci_state, NFA_HCI_STATE_DISABLED);
231 }
232
TEST_F(NfaHciRspTimeoutTest,TestNetworkEnableStateWithSuccess)233 TEST_F(NfaHciRspTimeoutTest, TestNetworkEnableStateWithSuccess) {
234 nfa_hci_cb.hci_state = NFA_HCI_STATE_WAIT_NETWK_ENABLE;
235 nfa_hci_cb.w4_hci_netwk_init = true;
236 nfa_hci_rsp_timeout();
237 ASSERT_FALSE(nfa_hci_cb.w4_hci_netwk_init);
238 }
239
TEST_F(NfaHciRspTimeoutTest,TestNetworkEnableStateWithFailure)240 TEST_F(NfaHciRspTimeoutTest, TestNetworkEnableStateWithFailure) {
241 nfa_hci_cb.hci_state = NFA_HCI_STATE_WAIT_NETWK_ENABLE;
242 nfa_hci_cb.w4_hci_netwk_init = false;
243 nfa_hci_rsp_timeout();
244 ASSERT_EQ(nfa_hci_cb.hci_state, NFA_HCI_STATE_DISABLED);
245 }
246
TEST_F(NfaHciRspTimeoutTest,TestRemoveGateState)247 TEST_F(NfaHciRspTimeoutTest, TestRemoveGateState) {
248 nfa_hci_cb.hci_state = NFA_HCI_STATE_REMOVE_GATE;
249 nfa_hci_cb.cmd_sent = NFA_HCI_ADM_DELETE_PIPE;
250 nfa_hci_rsp_timeout();
251 }
252
TEST_F(NfaHciRspTimeoutTest,TestAppDeregisterState)253 TEST_F(NfaHciRspTimeoutTest, TestAppDeregisterState) {
254 nfa_hci_cb.hci_state = NFA_HCI_STATE_APP_DEREGISTER;
255 nfa_hci_cb.cmd_sent = NFA_HCI_ADM_DELETE_PIPE;
256 nfa_hci_rsp_timeout();
257 }
258
TEST_F(NfaHciRspTimeoutTest,TestInvalidState)259 TEST_F(NfaHciRspTimeoutTest, TestInvalidState) {
260 nfa_hci_cb.hci_state = static_cast<tNFA_HCI_STATE>(-1);
261 nfa_hci_rsp_timeout();
262 ASSERT_EQ(nfa_hci_cb.hci_state, static_cast<tNFA_HCI_STATE>(-1));
263 }
264
265 class NfaHciSetReceiveBufTest : public ::testing::Test {
266 protected:
SetUp()267 void SetUp() override {
268 nfa_hci_cb.p_msg_data = nullptr;
269 nfa_hci_cb.max_msg_len = 0;
270 nfa_hci_cb.rsp_buf_size = 0;
271 nfa_hci_cb.p_rsp_buf = nullptr;
272 nfa_hci_cb.type = 0;
273 }
274 };
275
TEST_F(NfaHciSetReceiveBufTest,PipeNotInRange)276 TEST_F(NfaHciSetReceiveBufTest, PipeNotInRange) {
277 uint8_t pipe = 0;
278 nfa_hci_set_receive_buf(pipe);
279 EXPECT_EQ(nfa_hci_cb.p_msg_data, nfa_hci_cb.msg_data);
280 EXPECT_EQ(nfa_hci_cb.max_msg_len, NFA_MAX_HCI_EVENT_LEN);
281 }
282
TEST_F(NfaHciSetReceiveBufTest,PipeInRangeButWrongType)283 TEST_F(NfaHciSetReceiveBufTest, PipeInRangeButWrongType) {
284 uint8_t pipe = NFA_HCI_FIRST_DYNAMIC_PIPE;
285 nfa_hci_cb.type = 1;
286 nfa_hci_set_receive_buf(pipe);
287 EXPECT_EQ(nfa_hci_cb.p_msg_data, nfa_hci_cb.msg_data);
288 EXPECT_EQ(nfa_hci_cb.max_msg_len, NFA_MAX_HCI_EVENT_LEN);
289 }
290
TEST_F(NfaHciSetReceiveBufTest,PipeInRangeWithNoResponseBuffer)291 TEST_F(NfaHciSetReceiveBufTest, PipeInRangeWithNoResponseBuffer) {
292 uint8_t pipe = NFA_HCI_FIRST_DYNAMIC_PIPE;
293 nfa_hci_cb.type = NFA_HCI_EVENT_TYPE;
294 nfa_hci_cb.rsp_buf_size = 0;
295 nfa_hci_set_receive_buf(pipe);
296 EXPECT_EQ(nfa_hci_cb.p_msg_data, nfa_hci_cb.msg_data);
297 EXPECT_EQ(nfa_hci_cb.max_msg_len, NFA_MAX_HCI_EVENT_LEN);
298 }
299
TEST_F(NfaHciSetReceiveBufTest,PipeInRangeWithRspBufSizeZeroAndNullRspBuf)300 TEST_F(NfaHciSetReceiveBufTest, PipeInRangeWithRspBufSizeZeroAndNullRspBuf) {
301 uint8_t pipe = NFA_HCI_FIRST_DYNAMIC_PIPE;
302 nfa_hci_cb.type = NFA_HCI_EVENT_TYPE;
303 nfa_hci_cb.rsp_buf_size = 10;
304 nfa_hci_cb.p_rsp_buf = nullptr;
305 nfa_hci_set_receive_buf(pipe);
306 EXPECT_EQ(nfa_hci_cb.p_msg_data, nfa_hci_cb.msg_data);
307 EXPECT_EQ(nfa_hci_cb.max_msg_len, NFA_MAX_HCI_EVENT_LEN);
308 }
309
TEST_F(NfaHciSetReceiveBufTest,PipeInRangeWithValidRspBuf)310 TEST_F(NfaHciSetReceiveBufTest, PipeInRangeWithValidRspBuf) {
311 uint8_t pipe = NFA_HCI_FIRST_DYNAMIC_PIPE;
312 nfa_hci_cb.type = NFA_HCI_EVENT_TYPE;
313 nfa_hci_cb.rsp_buf_size = 10;
314 uint8_t rsp_buf[10] = {0};
315 nfa_hci_cb.p_rsp_buf = rsp_buf;
316 nfa_hci_set_receive_buf(pipe);
317 EXPECT_EQ(nfa_hci_cb.p_msg_data, rsp_buf);
318 EXPECT_EQ(nfa_hci_cb.max_msg_len, 10);
319 }
320
TEST_F(NfaHciSetReceiveBufTest,PipeInRangeWithValidRspBufOfDifferentSize)321 TEST_F(NfaHciSetReceiveBufTest, PipeInRangeWithValidRspBufOfDifferentSize) {
322 uint8_t pipe = NFA_HCI_FIRST_DYNAMIC_PIPE;
323 nfa_hci_cb.type = NFA_HCI_EVENT_TYPE;
324 nfa_hci_cb.rsp_buf_size = 20;
325 uint8_t rsp_buf[20] = {0};
326 nfa_hci_cb.p_rsp_buf = rsp_buf;
327 nfa_hci_set_receive_buf(pipe);
328 EXPECT_EQ(nfa_hci_cb.p_msg_data, rsp_buf);
329 EXPECT_EQ(nfa_hci_cb.max_msg_len, 20);
330 }
331
332 class NfaHciStartupTest : public ::testing::Test {
333 protected:
SetUp()334 void SetUp() override {
335 memset(&nfa_hci_cb, 0, sizeof(nfa_hci_cb));
336 }
337 };
338
TEST_F(NfaHciStartupTest,TestLoopbackDebugOn)339 TEST_F(NfaHciStartupTest, TestLoopbackDebugOn) {
340 HCI_LOOPBACK_DEBUG = NFA_HCI_DEBUG_ON;
341 nfa_hci_startup();
342 ASSERT_EQ(nfa_hci_cb.hci_state, NFA_HCI_STATE_DISABLED);
343 }
344
TEST_F(NfaHciStartupTest,TestNvRamNotRead)345 TEST_F(NfaHciStartupTest, TestNvRamNotRead) {
346 nfa_hci_cb.nv_read_cmplt = false;
347 nfa_hci_cb.ee_disc_cmplt = true;
348 nfa_hci_cb.conn_id = 0;
349 nfa_hci_startup();
350 ASSERT_EQ(nfa_hci_cb.hci_state, NFA_HCI_STATE_DISABLED);
351 }
352
TEST_F(NfaHciStartupTest,TestEeDiscNotComplete)353 TEST_F(NfaHciStartupTest, TestEeDiscNotComplete) {
354 nfa_hci_cb.nv_read_cmplt = true;
355 nfa_hci_cb.ee_disc_cmplt = false;
356 nfa_hci_cb.conn_id = 0;
357 nfa_hci_startup();
358 ASSERT_EQ(nfa_hci_cb.hci_state, NFA_HCI_STATE_DISABLED);
359 }
360
TEST_F(NfaHciStartupTest,TestConnIdNotZero)361 TEST_F(NfaHciStartupTest, TestConnIdNotZero) {
362 nfa_hci_cb.nv_read_cmplt = true;
363 nfa_hci_cb.ee_disc_cmplt = true;
364 nfa_hci_cb.conn_id = 1;
365 nfa_hci_startup();
366 ASSERT_EQ(nfa_hci_cb.hci_state, NFA_HCI_STATE_DISABLED);
367 }
368
TEST_F(NfaHciStartupTest,TestNoHciAccessInterfaceFound)369 TEST_F(NfaHciStartupTest, TestNoHciAccessInterfaceFound) {
370 nfa_hci_cb.nv_read_cmplt = true;
371 nfa_hci_cb.ee_disc_cmplt = true;
372 nfa_hci_cb.conn_id = 0;
373 nfa_hci_cb.num_nfcee = 1;
374 nfa_hci_cb.ee_info[0].ee_interface[0] = 0;
375 nfa_hci_startup();
376 ASSERT_EQ(nfa_hci_cb.hci_state, NFA_HCI_STATE_DISABLED);
377 }
378
TEST_F(NfaHciStartupTest,TestHciAccessInterfaceFoundButInactive)379 TEST_F(NfaHciStartupTest, TestHciAccessInterfaceFoundButInactive) {
380 nfa_hci_cb.nv_read_cmplt = true;
381 nfa_hci_cb.ee_disc_cmplt = true;
382 nfa_hci_cb.conn_id = 0;
383 nfa_hci_cb.num_nfcee = 1;
384 nfa_hci_cb.ee_info[0].ee_interface[0] = NFA_EE_INTERFACE_HCI_ACCESS;
385 nfa_hci_cb.ee_info[0].ee_status = NFA_EE_STATUS_INACTIVE;
386 nfa_hci_startup();
387 ASSERT_EQ(nfa_hci_cb.hci_state, NFA_HCI_STATE_DISABLED);
388 }
389
TEST_F(NfaHciStartupTest,TestFailedConnCreate)390 TEST_F(NfaHciStartupTest, TestFailedConnCreate) {
391 nfa_hci_cb.nv_read_cmplt = true;
392 nfa_hci_cb.ee_disc_cmplt = true;
393 nfa_hci_cb.conn_id = 0;
394 nfa_hci_cb.num_nfcee = 1;
395 nfa_hci_cb.ee_info[0].ee_interface[0] = NFA_EE_INTERFACE_HCI_ACCESS;
396 nfa_hci_cb.ee_info[0].ee_status = NFA_EE_STATUS_ACTIVE;
397 nfa_hci_startup();
398 ASSERT_EQ(nfa_hci_cb.hci_state, NFA_HCI_STATE_DISABLED);
399 }
400
TEST_F(NfaHciStartupTest,TestSuccessStartup)401 TEST_F(NfaHciStartupTest, TestSuccessStartup) {
402 nfa_hci_cb.nv_read_cmplt = true;
403 nfa_hci_cb.ee_disc_cmplt = true;
404 nfa_hci_cb.conn_id = 0;
405 nfa_hci_cb.num_nfcee = 1;
406 nfa_hci_cb.ee_info[0].ee_interface[0] = NFA_EE_INTERFACE_HCI_ACCESS;
407 nfa_hci_cb.ee_info[0].ee_status = NFA_EE_STATUS_ACTIVE;
408 nfa_hci_startup();
409 ASSERT_EQ(nfa_hci_cb.hci_state, NFA_HCI_STATE_DISABLED);
410 }
411
412 class NfaHciEeInfoCbackTest : public ::testing::Test {
413 protected:
SetUp()414 void SetUp() override {
415 nfa_hci_cb.hci_state = NFA_HCI_STATE_STARTUP;
416 nfa_hci_cb.num_nfcee = 1;
417 nfa_hci_cb.num_ee_dis_req_ntf = 0;
418 nfa_hci_cb.num_hot_plug_evts = 0;
419 nfa_hci_cb.conn_id = 0;
420 nfa_hci_cb.ee_disable_disc = false;
421 nfa_hci_cb.ee_disc_cmplt = false;
422 nfa_hci_cb.w4_hci_netwk_init = false;
423 nfa_hci_cb.timer = {};
424 }
425 };
426
TEST_F(NfaHciEeInfoCbackTest,TestEEStatusOn)427 TEST_F(NfaHciEeInfoCbackTest, TestEEStatusOn) {
428 nfa_hci_cb.hci_state = NFA_HCI_STATE_STARTUP;
429 nfa_hci_ee_info_cback(NFA_EE_DISC_STS_ON);
430 EXPECT_TRUE(nfa_hci_cb.ee_disc_cmplt);
431 EXPECT_EQ(nfa_hci_cb.num_ee_dis_req_ntf, 0);
432 EXPECT_EQ(nfa_hci_cb.num_hot_plug_evts, 0);
433 EXPECT_EQ(nfa_hci_cb.conn_id, 0);
434 }
435
TEST_F(NfaHciEeInfoCbackTest,TestEEStatusOff)436 TEST_F(NfaHciEeInfoCbackTest, TestEEStatusOff) {
437 nfa_hci_cb.hci_state = NFA_HCI_STATE_WAIT_NETWK_ENABLE;
438 nfa_hci_cb.num_nfcee = 2;
439 nfa_hci_cb.num_ee_dis_req_ntf = 1;
440 nfa_hci_cb.num_hot_plug_evts = 1;
441 nfa_hci_ee_info_cback(NFA_EE_DISC_STS_OFF);
442 EXPECT_TRUE(nfa_hci_cb.ee_disable_disc);
443 }
444
TEST_F(NfaHciEeInfoCbackTest,TestEEStatusOffNoUiccHost)445 TEST_F(NfaHciEeInfoCbackTest, TestEEStatusOffNoUiccHost) {
446 nfa_hci_cb.hci_state = NFA_HCI_STATE_WAIT_NETWK_ENABLE;
447 nfa_hci_cb.num_nfcee = 1;
448 nfa_hci_ee_info_cback(NFA_EE_DISC_STS_OFF);
449 EXPECT_FALSE(nfa_hci_cb.w4_hci_netwk_init);
450 }
451
TEST_F(NfaHciEeInfoCbackTest,TestEEStatusReq)452 TEST_F(NfaHciEeInfoCbackTest, TestEEStatusReq) {
453 nfa_hci_cb.hci_state = NFA_HCI_STATE_WAIT_NETWK_ENABLE;
454 nfa_hci_cb.num_ee_dis_req_ntf = 1;
455 nfa_hci_cb.num_nfcee = 2;
456 nfa_hci_ee_info_cback(NFA_EE_DISC_STS_REQ);
457 EXPECT_EQ(nfa_hci_cb.num_ee_dis_req_ntf, 2);
458 }
459
TEST_F(NfaHciEeInfoCbackTest,TestEEStatusRecoveryRediscovered)460 TEST_F(NfaHciEeInfoCbackTest, TestEEStatusRecoveryRediscovered) {
461 nfa_hci_cb.hci_state = NFA_HCI_STATE_WAIT_NETWK_ENABLE;
462 nfa_hci_ee_info_cback(NFA_EE_RECOVERY_REDISCOVERED);
463 EXPECT_EQ(nfa_hci_cb.num_nfcee, 0);
464 }
465
TEST_F(NfaHciEeInfoCbackTest,TestEEStatusModeSetComplete)466 TEST_F(NfaHciEeInfoCbackTest, TestEEStatusModeSetComplete) {
467 nfa_hci_cb.hci_state = NFA_HCI_STATE_WAIT_NETWK_ENABLE;
468 nfa_hci_ee_info_cback(NFA_EE_MODE_SET_COMPLETE);
469 EXPECT_EQ(nfa_hci_cb.num_nfcee, 0);
470 }
471
TEST_F(NfaHciEeInfoCbackTest,TestEEStatusRecoveryInit)472 TEST_F(NfaHciEeInfoCbackTest, TestEEStatusRecoveryInit) {
473 tNFA_DM_CB nfa_dm_cb_mock;
474 nfa_dm_cb_mock = tNFA_DM_CB{};
475 nfa_dm_cb_mock.disc_cb = tNFA_DM_DISC_CB{};
476 nfa_dm_cb_mock.disc_cb.disc_flags = 0xFFFF;
477 nfa_dm_cb = nfa_dm_cb_mock;
478 nfa_hci_ee_info_cback(NFA_EE_RECOVERY_INIT);
479 EXPECT_EQ(nfa_hci_cb.hci_state, NFA_HCI_STATE_EE_RECOVERY);
480 EXPECT_TRUE(nfa_ee_cb.isDiscoveryStopped);
481 }
482
483 class NfaHciSysDisableTest : public ::testing::Test {
484 protected:
485 };
486
TEST_F(NfaHciSysDisableTest,TestConnIdZero)487 TEST_F(NfaHciSysDisableTest, TestConnIdZero) {
488 nfa_hci_cb.conn_id = 0;
489 nfa_hci_cb.hci_state = NFA_HCI_STATE_STARTUP;
490 nfa_hci_sys_disable();
491 EXPECT_EQ(nfa_hci_cb.conn_id, 0);
492 EXPECT_EQ(nfa_hci_cb.hci_state, NFA_HCI_STATE_DISABLED);
493 }
494
TEST_F(NfaHciSysDisableTest,TestStateUpdate)495 TEST_F(NfaHciSysDisableTest, TestStateUpdate) {
496 nfa_hci_cb.conn_id = 1;
497 nfa_hci_cb.hci_state = NFA_HCI_STATE_STARTUP;
498 nfa_hci_sys_disable();
499 EXPECT_EQ(nfa_hci_cb.hci_state, NFA_HCI_STATE_DISABLED);
500 }
501
TEST_F(NfaHciSysDisableTest,TestGracefulDisableFalse)502 TEST_F(NfaHciSysDisableTest, TestGracefulDisableFalse) {
503 nfa_hci_cb.conn_id = 42;
504 nfa_hci_cb.hci_state = NFA_HCI_STATE_STARTUP;
505 nfa_sys_cb.graceful_disable = false;
506 uint8_t initial_conn_id = nfa_hci_cb.conn_id;
507 uint8_t initial_state = nfa_hci_cb.hci_state;
508 nfa_hci_sys_disable();
509 EXPECT_EQ(nfa_hci_cb.conn_id, 0);
510 EXPECT_EQ(nfa_hci_cb.hci_state, NFA_HCI_STATE_DISABLED);
511 }
512
TEST_F(NfaHciSysDisableTest,TestGracefulDisableWithNciVersion1_0)513 TEST_F(NfaHciSysDisableTest, TestGracefulDisableWithNciVersion1_0) {
514 nfa_hci_cb.conn_id = 42;
515 nfa_hci_cb.hci_state = NFA_HCI_STATE_STARTUP;
516 nfa_sys_cb.graceful_disable = true;
517 nfc_cb.nci_version = NCI_VERSION_1_0;
518 nfa_hci_sys_disable();
519 EXPECT_EQ(nfa_hci_cb.conn_id, 42);
520 EXPECT_EQ(nfa_hci_cb.hci_state, NFA_HCI_STATE_STARTUP);
521 }
522
523 class NfaHciHandleNvReadTest : public ::testing::Test {
524 protected:
SetUp()525 void SetUp() override {
526 memset(&nfa_hci_cb, 0, sizeof(nfa_hci_cb));
527 nfa_hci_cb.cfg.admin_gate.session_id[0] = 0x00;
528 nfa_hci_cb.timer = {};
529 }
530 uint8_t default_session[NFA_HCI_SESSION_ID_LEN] = {
531 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF};
532 uint8_t reset_session[NFA_HCI_SESSION_ID_LEN] = {
533 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
534 };
535
TEST_F(NfaHciHandleNvReadTest,StatusOkValidConfig)536 TEST_F(NfaHciHandleNvReadTest, StatusOkValidConfig) {
537 uint8_t block = DH_NV_BLOCK;
538 tNFA_STATUS status = NFA_STATUS_OK;
539 memcpy(nfa_hci_cb.cfg.admin_gate.session_id, reset_session, NFA_HCI_SESSION_ID_LEN);
540 nfa_hci_handle_nv_read(block, status);
541 EXPECT_TRUE(nfa_hci_cb.nv_read_cmplt);
542 EXPECT_TRUE(nfa_hci_cb.b_hci_netwk_reset);
543 }
544
TEST_F(NfaHciHandleNvReadTest,StatusNotOk)545 TEST_F(NfaHciHandleNvReadTest, StatusNotOk) {
546 uint8_t block = DH_NV_BLOCK;
547 tNFA_STATUS status = NFA_STATUS_FAILED;
548 nfa_hci_handle_nv_read(block, status);
549 EXPECT_TRUE(nfa_hci_cb.b_hci_netwk_reset);
550 }
551
TEST_F(NfaHciHandleNvReadTest,InvalidConfig)552 TEST_F(NfaHciHandleNvReadTest, InvalidConfig) {
553 uint8_t block = DH_NV_BLOCK;
554 tNFA_STATUS status = NFA_STATUS_OK;
555 uint8_t invalid_session[NFA_HCI_SESSION_ID_LEN] = {
556 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01};
557 memcpy(nfa_hci_cb.cfg.admin_gate.session_id, invalid_session, NFA_HCI_SESSION_ID_LEN);
558 nfa_hci_handle_nv_read(block, status);
559 EXPECT_FALSE(nfa_hci_cb.b_hci_netwk_reset);
560 }
561
TEST_F(NfaHciHandleNvReadTest,SessionIdIsDefaultSession)562 TEST_F(NfaHciHandleNvReadTest, SessionIdIsDefaultSession) {
563 uint8_t block = DH_NV_BLOCK;
564 tNFA_STATUS status = NFA_STATUS_OK;
565 memcpy(nfa_hci_cb.cfg.admin_gate.session_id, default_session, NFA_HCI_SESSION_ID_LEN);
566 nfa_hci_handle_nv_read(block, status);
567 EXPECT_TRUE(nfa_hci_cb.b_hci_netwk_reset);
568 }
TEST_F(NfaHciHandleNvReadTest,SessionIdIsResetSession)569 TEST_F(NfaHciHandleNvReadTest, SessionIdIsResetSession) {
570 uint8_t block = DH_NV_BLOCK;
571 tNFA_STATUS status = NFA_STATUS_OK;
572 memcpy(nfa_hci_cb.cfg.admin_gate.session_id, reset_session, NFA_HCI_SESSION_ID_LEN);
573 nfa_hci_handle_nv_read(block, status);
574 EXPECT_TRUE(nfa_hci_cb.b_hci_netwk_reset);
575 }
576
577 class NfaHciEvtHdlrTest : public ::testing::Test {
578 protected:
SetUp()579 void SetUp() override {
580 memset(&nfa_hci_cb, 0, sizeof(nfa_hci_cb));
581 gki_utils = new MockGkiUtils();
582 }
TearDown()583 void TearDown() override { gki_utils = nullptr; }
584 };
585
TEST_F(NfaHciEvtHdlrTest,EventInApiRequestRange)586 TEST_F(NfaHciEvtHdlrTest, EventInApiRequestRange) {
587 NFC_HDR msg;
588 msg.event = NFA_HCI_FIRST_API_EVENT + 1;
589 msg.len = 0;
590 nfa_hci_evt_hdlr(&msg);
591 EXPECT_EQ(nfa_hci_cb.hci_api_q.count, 0);
592 }
593
TEST_F(NfaHciEvtHdlrTest,NvWriteEvent)594 TEST_F(NfaHciEvtHdlrTest, NvWriteEvent) {
595 NFC_HDR msg;
596 msg.event = NFA_HCI_RSP_NV_WRITE_EVT;
597 msg.len = 0;
598 nfa_hci_evt_hdlr(&msg);
599 EXPECT_EQ(nfa_hci_cb.nv_write_needed, false);
600 }
601
TEST_F(NfaHciEvtHdlrTest,EventGreaterThanLastApiEvent)602 TEST_F(NfaHciEvtHdlrTest, EventGreaterThanLastApiEvent) {
603 NFC_HDR msg;
604 msg.event = NFA_HCI_LAST_API_EVENT + 1;
605 msg.len = 0;
606 nfa_hci_evt_hdlr(&msg);
607 }
608
TEST_F(NfaHciEvtHdlrTest,NvWriteNeededInIdleState)609 TEST_F(NfaHciEvtHdlrTest, NvWriteNeededInIdleState) {
610 NFC_HDR msg;
611 msg.event = NFA_HCI_RSP_NV_READ_EVT;
612 msg.len = 0;
613 nfa_hci_cb.hci_state = NFA_HCI_STATE_IDLE;
614 nfa_hci_cb.nv_write_needed = true;
615 nfa_hci_evt_hdlr(&msg);
616 EXPECT_EQ(nfa_hci_cb.nv_write_needed, false);
617 }
618
TEST_F(NfaHciEvtHdlrTest,NoHostResetting)619 TEST_F(NfaHciEvtHdlrTest, NoHostResetting) {
620 NFC_HDR msg;
621 msg.event = NFA_HCI_RSP_NV_READ_EVT;
622 msg.len = 0;
623 nfa_hci_cb.hci_state = NFA_HCI_STATE_IDLE;
624 nfa_hci_cb.nv_write_needed = true;
625 nfa_hci_evt_hdlr(&msg);
626 EXPECT_EQ(nfa_hci_cb.nv_write_needed, false);
627 }
628
629 class NfaHciInitTest : public ::testing::Test {
630 protected:
SetUp()631 void SetUp() override {
632 memset(&nfa_hci_cb, 0, sizeof(nfa_hci_cb));
633 }
634 };
635
TEST_F(NfaHciInitTest,ControlBlockInitialization)636 TEST_F(NfaHciInitTest, ControlBlockInitialization) {
637 nfa_hci_init();
638 EXPECT_EQ(nfa_hci_cb.hci_state, NFA_HCI_STATE_STARTUP);
639 EXPECT_EQ(nfa_hci_cb.num_nfcee, NFA_HCI_MAX_HOST_IN_NETWORK);
640 }
641
642 class NfaHciRestoreDefaultConfigTest : public ::testing::Test {
643 protected:
SetUp()644 void SetUp() override {
645 memset(&nfa_hci_cb, 0, sizeof(nfa_hci_cb));
646 }
TearDown()647 void TearDown() override {
648 memset(&nfa_hci_cb, 0, sizeof(nfa_hci_cb));
649 }
650 };
TEST_F(NfaHciRestoreDefaultConfigTest,SessionIdCopy)651 TEST_F(NfaHciRestoreDefaultConfigTest, SessionIdCopy) {
652 uint8_t session_id[NFA_HCI_SESSION_ID_LEN] = {1, 2, 3, 4, 5, 6, 7, 8};
653 nfa_hci_restore_default_config(session_id);
654 for (size_t i = 0; i < NFA_HCI_SESSION_ID_LEN; ++i) {
655 EXPECT_EQ(nfa_hci_cb.cfg.admin_gate.session_id[i], session_id[i]);
656 }
657 }
658
TEST_F(NfaHciRestoreDefaultConfigTest,NvWriteNeededFlag)659 TEST_F(NfaHciRestoreDefaultConfigTest, NvWriteNeededFlag) {
660 uint8_t session_id[NFA_HCI_SESSION_ID_LEN] = {1, 2, 3, 4, 5, 6, 7, 8};
661 nfa_hci_restore_default_config(session_id);
662 EXPECT_TRUE(nfa_hci_cb.nv_write_needed);
663 }
664
665 class NfaHciEnableOneNfceeTest : public :: testing :: Test{
SetUp()666 void SetUp() override{
667 memset(&nfa_hci_cb, 0, sizeof(nfa_hci_cb));
668 memset(&nfa_ee_cb, 0, sizeof(nfa_ee_cb));
669 }
670 };
671
TEST_F(NfaHciEnableOneNfceeTest,ActivateInactiveNFCEE)672 TEST_F(NfaHciEnableOneNfceeTest, ActivateInactiveNFCEE) {
673 nfa_hci_cb.num_nfcee = 1;
674 nfa_hci_cb.ee_info[0].ee_status = NFA_EE_STATUS_INACTIVE;
675 nfa_hci_cb.ee_info[0].ee_handle = 0x01;
676 nfa_hci_enable_one_nfcee();
677 EXPECT_EQ(nfa_hci_cb.ee_info[0].ee_status, NFC_MODE_ACTIVATE);
678 }
679
TEST_F(NfaHciEnableOneNfceeTest,NoActionWhenAllNfceesActive)680 TEST_F(NfaHciEnableOneNfceeTest, NoActionWhenAllNfceesActive) {
681 nfa_hci_cb.num_nfcee = 2;
682 nfa_hci_cb.ee_info[0].ee_status = NFA_EE_STATUS_ACTIVE;
683 nfa_hci_cb.ee_info[1].ee_status = NFA_EE_STATUS_ACTIVE;
684 nfa_hci_enable_one_nfcee();
685 EXPECT_EQ(nfa_hci_cb.num_nfcee, 2);
686 EXPECT_EQ(nfa_hci_cb.ee_info[0].ee_status, NFA_EE_STATUS_ACTIVE);
687 EXPECT_EQ(nfa_hci_cb.ee_info[1].ee_status, NFA_EE_STATUS_ACTIVE);
688 }
689
TEST_F(NfaHciEnableOneNfceeTest,WaitNetworkEnableState)690 TEST_F(NfaHciEnableOneNfceeTest, WaitNetworkEnableState) {
691 nfa_hci_cb.num_nfcee = 0;
692 nfa_hci_cb.hci_state = NFA_HCI_STATE_WAIT_NETWK_ENABLE;
693 nfa_hci_enable_one_nfcee();
694 EXPECT_EQ(nfa_hci_cb.hci_state, NFA_HCI_STATE_WAIT_NETWK_ENABLE);
695 }
696
TEST_F(NfaHciEnableOneNfceeTest,RestoreNetworkEnableState)697 TEST_F(NfaHciEnableOneNfceeTest, RestoreNetworkEnableState) {
698 nfa_hci_cb.num_nfcee = 0;
699 nfa_hci_cb.hci_state = NFA_HCI_STATE_RESTORE_NETWK_ENABLE;
700 nfa_hci_enable_one_nfcee();
701 EXPECT_EQ(nfa_hci_cb.hci_state, NFA_HCI_STATE_RESTORE_NETWK_ENABLE);
702 }
703
TEST_F(NfaHciEnableOneNfceeTest,EeRecoveryState)704 TEST_F(NfaHciEnableOneNfceeTest, EeRecoveryState) {
705 nfa_hci_cb.num_nfcee = 0;
706 nfa_hci_cb.hci_state = NFA_HCI_STATE_EE_RECOVERY;
707 nfa_ee_cb.isDiscoveryStopped = false;
708 nfa_hci_enable_one_nfcee();
709 EXPECT_EQ(nfa_hci_cb.hci_state, NFA_HCI_STATE_IDLE);
710 EXPECT_FALSE(nfa_ee_cb.isDiscoveryStopped);
711 }
712
713