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