• 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_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