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_rw_main.cc"
18 #include <gtest/gtest.h>
19 #include <gmock/gmock.h>
20
21 class NfaRwEvt2StrTest: public :: testing::Test{
22 protected:
23 };
24
TEST_F(NfaRwEvt2StrTest,TestKnownEvents)25 TEST_F(NfaRwEvt2StrTest, TestKnownEvents){
26 EXPECT_EQ(nfa_rw_evt_2_str(NFA_RW_OP_REQUEST_EVT),"NFA_RW_OP_REQUEST_EVT");
27 EXPECT_EQ(nfa_rw_evt_2_str(NFA_RW_ACTIVATE_NTF_EVT),"NFA_RW_ACTIVATE_NTF_EVT");
28 EXPECT_EQ(nfa_rw_evt_2_str(NFA_RW_DEACTIVATE_NTF_EVT),"NFA_RW_DEACTIVATE_NTF_EVT");
29 EXPECT_EQ(nfa_rw_evt_2_str(NFA_RW_PRESENCE_CHECK_TICK_EVT),"NFA_RW_PRESENCE_CHECK_TICK_EVT");
30 EXPECT_EQ(nfa_rw_evt_2_str(
31 NFA_RW_PRESENCE_CHECK_TIMEOUT_EVT),"NFA_RW_PRESENCE_CHECK_TIMEOUT_EVT");
32 }
33
TEST_F(NfaRwEvt2StrTest,TestUnknownEvents)34 TEST_F(NfaRwEvt2StrTest, TestUnknownEvents){
35 EXPECT_EQ(nfa_rw_evt_2_str(0xFF),"Unknown");
36 }
37
38 class NfaRwHandleEventTest : public ::testing::Test {
39 protected:
40 tNFA_RW_ACTION test_nfa_rw_action_tbl[NFA_RW_MAX_EVT];
SetUp()41 void SetUp() override {
42 memcpy(test_nfa_rw_action_tbl, nfa_rw_action_tbl, sizeof(nfa_rw_action_tbl));
43 for (int i = 0; i < NFA_RW_MAX_EVT; ++i) {
44 test_nfa_rw_action_tbl[i] = nfa_rw_handle_valid_event;
45 }
46 }
nfa_rw_handle_valid_event(tNFA_RW_MSG * p_msg)47 static bool nfa_rw_handle_valid_event(tNFA_RW_MSG* p_msg) {
48 (void )p_msg;
49 return true;
50 }
nfa_rw_handle_invalid_event(tNFA_RW_MSG * p_msg)51 static bool nfa_rw_handle_invalid_event(tNFA_RW_MSG* p_msg) {
52 (void )p_msg;
53 return false;
54 }
SetTestActionTable()55 void SetTestActionTable() {
56 for (int i = 0; i < NFA_RW_MAX_EVT; ++i) {
57 const_cast<tNFA_RW_ACTION*>(nfa_rw_action_tbl)[i] = test_nfa_rw_action_tbl[i];
58 }
59 std::cout << "Test action table set to global action table" << std::endl;
60 }
61 };
62
TEST_F(NfaRwHandleEventTest,ValidEventHandled)63 TEST_F(NfaRwHandleEventTest, ValidEventHandled) {
64 NFC_HDR msg;
65 msg.event = 0x01;
66 msg.len = 0;
67 test_nfa_rw_action_tbl[0x01] = nfa_rw_handle_valid_event;
68 SetTestActionTable();
69 std::cout << "Starting test for valid event (0x01)" << std::endl;
70 bool result = nfa_rw_handle_valid_event((tNFA_RW_MSG*)&msg);
71 std::cout << "Test result for valid event (0x01): " << result << std::endl;
72 EXPECT_TRUE(result);
73 }
74
TEST_F(NfaRwHandleEventTest,ValidEventButHandlerFails)75 TEST_F(NfaRwHandleEventTest, ValidEventButHandlerFails) {
76 NFC_HDR msg;
77 msg.event = 0x02;
78 msg.len = 0;
79 test_nfa_rw_action_tbl[0x02] = nfa_rw_handle_invalid_event;
80 SetTestActionTable();
81 bool result = nfa_rw_handle_event(&msg);
82 EXPECT_TRUE(result);
83 }
84
TEST_F(NfaRwHandleEventTest,InvalidEvent)85 TEST_F(NfaRwHandleEventTest, InvalidEvent) {
86 NFC_HDR msg;
87 msg.event = 0xFF;
88 msg.len = 0;
89 SetTestActionTable();
90 bool result = nfa_rw_handle_event(&msg);
91 EXPECT_TRUE(result);
92 }
93
TEST_F(NfaRwHandleEventTest,EventExceedsMax)94 TEST_F(NfaRwHandleEventTest, EventExceedsMax) {
95 NFC_HDR msg;
96 msg.event = NFA_RW_MAX_EVT + 1;
97 msg.len = 0;
98 SetTestActionTable();
99 bool result = nfa_rw_handle_event(&msg);
100 EXPECT_TRUE(result);
101 }
102
TEST_F(NfaRwHandleEventTest,EventNoHandlerSet)103 TEST_F(NfaRwHandleEventTest, EventNoHandlerSet) {
104 NFC_HDR msg;
105 msg.event = 0x03;
106 msg.len = 0;
107 test_nfa_rw_action_tbl[0x03] = nullptr;
108 SetTestActionTable();
109 bool result = nfa_rw_handle_event(&msg);
110 EXPECT_TRUE(result);
111 }
112
113 class NfaRwSendRawFrameTest : public ::testing::Test {
114 protected:
SetUp()115 void SetUp() override {
116 GKI_init();
117 }
118 };
119
TEST_F(NfaRwSendRawFrameTest,SuccessCase)120 TEST_F(NfaRwSendRawFrameTest, SuccessCase) {
121 NFC_HDR* p_data = (NFC_HDR*)GKI_getbuf(sizeof(NFC_HDR));
122 ASSERT_NE(p_data, nullptr);
123 tNFA_STATUS status = nfa_rw_send_raw_frame(p_data);
124 EXPECT_EQ(status, NFA_STATUS_OK);
125 GKI_freebuf(p_data);
126 }
127
TEST_F(NfaRwSendRawFrameTest,AllocationFailure)128 TEST_F(NfaRwSendRawFrameTest, AllocationFailure) {
129 GKI_disable();
130 tNFA_STATUS status = nfa_rw_send_raw_frame(nullptr);
131 EXPECT_EQ(status, NFA_STATUS_OK);
132 GKI_enable();
133 }
134
TEST_F(NfaRwSendRawFrameTest,EventHandlingSuccess)135 TEST_F(NfaRwSendRawFrameTest, EventHandlingSuccess) {
136 NFC_HDR* p_data = (NFC_HDR*)GKI_getbuf(sizeof(NFC_HDR));
137 ASSERT_NE(p_data, nullptr);
138 tNFA_STATUS status = nfa_rw_send_raw_frame(p_data);
139 EXPECT_EQ(status, NFA_STATUS_OK);
140 }
141
TEST_F(NfaRwSendRawFrameTest,EventHandlingFailure)142 TEST_F(NfaRwSendRawFrameTest, EventHandlingFailure) {
143 NFC_HDR* p_data = (NFC_HDR*)GKI_getbuf(sizeof(NFC_HDR));
144 ASSERT_NE(p_data, nullptr);
145 tNFA_STATUS status = nfa_rw_send_raw_frame(p_data);
146 EXPECT_EQ(status, NFA_STATUS_OK);
147 GKI_freebuf(p_data);
148 }
149
150 class NfaRwProcDiscEvtTest : public ::testing::Test {
151 protected:
152 tNFC_DISCOVER discover_data;
153 tNFA_RW_MSG msg;
SetUp()154 void SetUp() override {
155 memset(&discover_data, 0, sizeof(discover_data));
156 }
157 };
158
TEST_F(NfaRwProcDiscEvtTest,TestActivatedEvent)159 TEST_F(NfaRwProcDiscEvtTest, TestActivatedEvent) {
160 msg.activate_ntf.p_activate_params = nullptr;
161 bool excl_rf_not_active = false;
162 testing::internal::CaptureStdout();
163 nfa_rw_proc_disc_evt(NFA_DM_RF_DISC_ACTIVATED_EVT, &discover_data, excl_rf_not_active);
164 std::string output = testing::internal::GetCapturedStdout();
165 EXPECT_EQ(output.find("Event: 1"), std::string::npos);
166 }
167
TEST_F(NfaRwProcDiscEvtTest,TestDeactivatedEvent)168 TEST_F(NfaRwProcDiscEvtTest, TestDeactivatedEvent) {
169 msg.activate_ntf.p_activate_params = nullptr;
170 bool excl_rf_not_active = false;
171 testing::internal::CaptureStdout();
172 nfa_rw_proc_disc_evt(NFA_DM_RF_DISC_DEACTIVATED_EVT, &discover_data, excl_rf_not_active);
173 std::string output = testing::internal::GetCapturedStdout();
174 EXPECT_EQ(output.find("Event: 2"), std::string::npos);
175 }
176
TEST_F(NfaRwProcDiscEvtTest,TestUnknownEvent)177 TEST_F(NfaRwProcDiscEvtTest, TestUnknownEvent) {
178 msg.activate_ntf.p_activate_params = nullptr;
179 bool excl_rf_not_active = false;
180 testing::internal::CaptureStdout();
181 nfa_rw_proc_disc_evt(0xFF, &discover_data, excl_rf_not_active);
182 std::string output = testing::internal::GetCapturedStdout();
183 EXPECT_EQ(output, "");
184 }
185
resetNFCStaticCallback()186 void resetNFCStaticCallback() {
187 NFC_SetStaticRfCback(nullptr);
188 }
189
190 class NfaRwSysDisableTest : public testing::Test {
191 protected:
SetUp()192 void SetUp() override {
193 memset(&rw_cb, 0, sizeof(tRW_CB));
194 memset(&nfa_rw_cb, 0, sizeof(tNFA_RW_CB));
195 }
196 };
197
TEST_F(NfaRwSysDisableTest,TestRWCBTypeT1T)198 TEST_F(NfaRwSysDisableTest, TestRWCBTypeT1T) {
199 rw_cb.tcb_type = RW_CB_TYPE_T1T;
200 resetNFCStaticCallback();
201 NFC_HDR* p_buf = (NFC_HDR*) malloc(sizeof(NFC_HDR));
202 ASSERT_NE(p_buf, nullptr);
203 p_buf->event = 0;
204 p_buf->len = 10;
205 rw_cb.tcb.t1t.p_cur_cmd_buf = p_buf;
206 nfa_rw_sys_disable();
207 nfa_rw_stop_presence_check_timer();
208 ASSERT_EQ(rw_cb.tcb.t1t.p_cur_cmd_buf, nullptr);
209 ASSERT_EQ(rw_cb.tcb_type, RW_CB_TYPE_UNKNOWN);
210 ASSERT_EQ(nfa_rw_cb.p_pending_msg, nullptr);
211 }
212
TEST_F(NfaRwSysDisableTest,TestRWCBTypeT2T)213 TEST_F(NfaRwSysDisableTest, TestRWCBTypeT2T) {
214 rw_cb.tcb_type = RW_CB_TYPE_T2T;
215 resetNFCStaticCallback();
216 NFC_HDR* p_buf1 = (NFC_HDR*) malloc(sizeof(NFC_HDR));
217 NFC_HDR* p_buf2 = (NFC_HDR*) malloc(sizeof(NFC_HDR));
218 ASSERT_NE(p_buf1, nullptr);
219 ASSERT_NE(p_buf2, nullptr);
220 p_buf1->event = 0;
221 p_buf1->len = 10;
222 p_buf2->event = 0;
223 p_buf2->len = 10;
224 rw_cb.tcb.t2t.p_cur_cmd_buf = p_buf1;
225 rw_cb.tcb.t2t.p_sec_cmd_buf = p_buf2;
226 nfa_rw_sys_disable();
227 nfa_rw_stop_presence_check_timer();
228 ASSERT_EQ(rw_cb.tcb.t2t.p_cur_cmd_buf, nullptr);
229 ASSERT_EQ(rw_cb.tcb.t2t.p_sec_cmd_buf, nullptr);
230 ASSERT_EQ(rw_cb.tcb_type, RW_CB_TYPE_UNKNOWN);
231 ASSERT_EQ(nfa_rw_cb.p_pending_msg, nullptr);
232 }
233
TEST_F(NfaRwSysDisableTest,TestRWCBTypeT3T)234 TEST_F(NfaRwSysDisableTest, TestRWCBTypeT3T) {
235 rw_cb.tcb_type = RW_CB_TYPE_T3T;
236 resetNFCStaticCallback();
237 NFC_HDR* p_buf = (NFC_HDR*) malloc(sizeof(NFC_HDR));
238 ASSERT_NE(p_buf, nullptr);
239 p_buf->event = 0;
240 p_buf->len = 10;
241 rw_cb.tcb.t3t.p_cur_cmd_buf = p_buf;
242 nfa_rw_sys_disable();
243 nfa_rw_stop_presence_check_timer();
244 ASSERT_EQ(rw_cb.tcb.t3t.p_cur_cmd_buf, nullptr);
245 ASSERT_EQ(rw_cb.tcb_type, RW_CB_TYPE_UNKNOWN);
246 ASSERT_EQ(nfa_rw_cb.p_pending_msg, nullptr);
247 }
248
249 // Test 4: RW_CB_TYPE_T5T - Ensure buffer is freed
TEST_F(NfaRwSysDisableTest,TestRWCBTypeT5T)250 TEST_F(NfaRwSysDisableTest, TestRWCBTypeT5T) {
251 rw_cb.tcb_type = RW_CB_TYPE_T5T;
252 resetNFCStaticCallback();
253 NFC_HDR* p_buf = (NFC_HDR*) malloc(sizeof(NFC_HDR));
254 ASSERT_NE(p_buf, nullptr);
255 p_buf->event = 0;
256 p_buf->len = 10;
257 rw_cb.tcb.i93.p_retry_cmd = p_buf;
258 nfa_rw_sys_disable();
259 nfa_rw_stop_presence_check_timer();
260 ASSERT_EQ(rw_cb.tcb.i93.p_retry_cmd, nullptr);
261 ASSERT_EQ(rw_cb.tcb_type, RW_CB_TYPE_UNKNOWN);
262 ASSERT_EQ(nfa_rw_cb.p_pending_msg, nullptr);
263 }
264
TEST_F(NfaRwSysDisableTest,TestRWCBTypeUnknown)265 TEST_F(NfaRwSysDisableTest, TestRWCBTypeUnknown) {
266 rw_cb.tcb_type = RW_CB_TYPE_UNKNOWN;
267 resetNFCStaticCallback();
268 nfa_rw_sys_disable();
269 nfa_rw_stop_presence_check_timer();
270 ASSERT_EQ(rw_cb.tcb_type, RW_CB_TYPE_UNKNOWN);
271 ASSERT_EQ(nfa_rw_cb.p_pending_msg, nullptr);
272 }
273
274
275