• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 //
2 // Copyright (C) 2024 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_dm_act.cc"
18 
19 #include <gmock/gmock.h>
20 #include <gtest/gtest.h>
21 
22 #include "mock_gki_utils.h"
23 
24 class NfaDmActDataCbackTest : public ::testing::Test {
25 protected:
SetUp()26     void SetUp() override {
27         memset(&nfa_dm_cb, 0, sizeof(nfa_dm_cb));
28     }
TearDown()29     void TearDown() override {
30     }
31 };
32 
TEST_F(NfaDmActDataCbackTest,TestNfcDataCevtWithValidData)33 TEST_F(NfaDmActDataCbackTest, TestNfcDataCevtWithValidData) {
34     uint8_t conn_id = 0;
35     tNFC_CONN_EVT event = NFC_DATA_CEVT;
36     NFC_HDR msg;
37     uint8_t data[10] = {0};
38     tNFC_CONN p_data = {0};
39     msg.len = 10;
40     msg.offset = 0;
41     tNFA_CONN_EVT_DATA evt_data = {};
42     evt_data.data.status = NFA_STATUS_OK;
43     evt_data.data.p_data = data;
44     evt_data.data.len = msg.len;
45     nfa_dm_act_data_cback(conn_id, event, &p_data);
46 }
47 
TEST_F(NfaDmActDataCbackTest,TestNfcDataCevtWithNullData)48 TEST_F(NfaDmActDataCbackTest, TestNfcDataCevtWithNullData) {
49     uint8_t conn_id = 0;
50     tNFC_CONN_EVT event = NFC_DATA_CEVT;
51     tNFC_CONN p_data = {};
52     p_data.data.p_data = nullptr;
53     nfa_dm_act_data_cback(conn_id, event, &p_data);
54 }
55 
TEST_F(NfaDmActDataCbackTest,TestNfcDeactivateCevt)56 TEST_F(NfaDmActDataCbackTest, TestNfcDeactivateCevt) {
57     uint8_t conn_id = 0;
58     tNFC_CONN_EVT event = NFC_DEACTIVATE_CEVT;
59     tNFC_CONN p_data = {};
60     nfa_dm_act_data_cback(conn_id, event, &p_data);
61 }
62 
63 class NfaDmActDeactivateTest : public ::testing::Test {
64 protected:
SetUp()65     void SetUp() override {
66         memset(&nfa_dm_cb, 0, sizeof(nfa_dm_cb));
67         nfa_dm_cb.disc_cb.activated_protocol = NFA_PROTOCOL_T1T;
68         nfa_dm_cb.disc_cb.disc_state = NFA_DM_RFST_W4_HOST_SELECT;
69         nfa_dm_cb.disc_cb.kovio_tle.in_use = false;
70         appl_dta_mode_flag = false;
71     }
TearDown()72     void TearDown() override {
73     }
74     MOCK_METHOD(tNFC_STATUS, nfa_dm_rf_deactivate, (tNFA_DEACTIVATE_TYPE deact_type), ());
75     MOCK_METHOD(void, nfa_sys_stop_timer, (TIMER_LIST_ENT* p_tle), ());
76     MOCK_METHOD(void, nfa_rw_stop_presence_check_timer, (), ());
77     MOCK_METHOD(void, nfa_dm_conn_cback_event_notify, (
78             uint8_t event, tNFA_CONN_EVT_DATA* p_data), ());
79 };
80 
TEST_F(NfaDmActDeactivateTest,TestDeactivationToIdle)81 TEST_F(NfaDmActDeactivateTest, TestDeactivationToIdle) {
82     tNFA_DM_MSG deactivate_msg = {};
83     deactivate_msg.deactivate.sleep_mode = false;
84     EXPECT_CALL(*this, nfa_dm_rf_deactivate(NFA_DEACTIVATE_TYPE_IDLE)).Times(0);
85     bool result = nfa_dm_act_deactivate(&deactivate_msg);
86     EXPECT_TRUE(result);
87 }
88 
TEST_F(NfaDmActDeactivateTest,TestDeactivationToSleepInvalidProtocol)89 TEST_F(NfaDmActDeactivateTest, TestDeactivationToSleepInvalidProtocol) {
90     tNFA_DM_MSG deactivate_msg = {};
91     deactivate_msg.deactivate.sleep_mode = true;
92     nfa_dm_cb.disc_cb.activated_protocol = 0xFF;
93     EXPECT_CALL(*this, nfa_dm_rf_deactivate(testing::_)).Times(0);
94     EXPECT_CALL(*this, nfa_rw_stop_presence_check_timer()).Times(0);
95     bool result = nfa_dm_act_deactivate(&deactivate_msg);
96     EXPECT_TRUE(result);
97 }
98 
TEST_F(NfaDmActDeactivateTest,TestDeactivationInvalidState)99 TEST_F(NfaDmActDeactivateTest, TestDeactivationInvalidState) {
100     tNFA_DM_MSG deactivate_msg = {};
101     deactivate_msg.deactivate.sleep_mode = false;
102     nfa_dm_cb.disc_cb.disc_state = NFA_DM_RFST_W4_ALL_DISCOVERIES;
103     nfa_dm_cb.disc_cb.activated_protocol = NFA_PROTOCOL_T1T;
104     EXPECT_CALL(*this, nfa_dm_rf_deactivate(NFA_DEACTIVATE_TYPE_IDLE)).Times(0);
105     bool result = nfa_dm_act_deactivate(&deactivate_msg);
106     EXPECT_TRUE(result);
107 }
108 
TEST_F(NfaDmActDeactivateTest,TestDeactivationInvalidProtocol)109 TEST_F(NfaDmActDeactivateTest, TestDeactivationInvalidProtocol) {
110     tNFA_DM_MSG deactivate_msg = {};
111     deactivate_msg.deactivate.sleep_mode = true;
112     nfa_dm_cb.disc_cb.activated_protocol = NFA_PROTOCOL_NFC_DEP;
113     appl_dta_mode_flag = true;
114     EXPECT_CALL(*this, nfa_dm_rf_deactivate(testing::_)).Times(0);
115     EXPECT_CALL(*this, nfa_dm_conn_cback_event_notify(
116             NFA_DEACTIVATE_FAIL_EVT, testing::_)).Times(0);
117     bool result = nfa_dm_act_deactivate(&deactivate_msg);
118     EXPECT_TRUE(result);
119 }
120 
121 class NfaDmActDisableTimeoutTest : public ::testing::Test {
122 protected:
SetUp()123     void SetUp() override {
124     }
TearDown()125     void TearDown() override {
126     }
127 };
128 
TEST_F(NfaDmActDisableTimeoutTest,TestDisableTimeoutBasic)129 TEST_F(NfaDmActDisableTimeoutTest, TestDisableTimeoutBasic) {
130     tNFA_DM_MSG msg = {};
131     bool result = nfa_dm_act_disable_timeout(&msg);
132     EXPECT_TRUE(result);
133 }
134 
TEST_F(NfaDmActDisableTimeoutTest,TestGracefulFlagIsFalse)135 TEST_F(NfaDmActDisableTimeoutTest, TestGracefulFlagIsFalse) {
136     tNFA_DM_MSG msg = {};
137     bool result = nfa_dm_act_disable_timeout(&msg);
138     EXPECT_TRUE(result);
139 }
140 
TEST_F(NfaDmActDisableTimeoutTest,TestDisableTimeoutNoException)141 TEST_F(NfaDmActDisableTimeoutTest, TestDisableTimeoutNoException) {
142     tNFA_DM_MSG msg = {};
143     bool result = nfa_dm_act_disable_timeout(&msg);
144     EXPECT_TRUE(result);
145 }
146 
TEST_F(NfaDmActDisableTimeoutTest,TestDisableTimeoutReturnsTrue)147 TEST_F(NfaDmActDisableTimeoutTest, TestDisableTimeoutReturnsTrue) {
148     tNFA_DM_MSG msg = {};
149     bool result = nfa_dm_act_disable_timeout(&msg);
150     EXPECT_TRUE(result);
151 }
152 
153 class NfaDmActGetRfDiscDurationTest : public ::testing::Test {
154 protected:
SetUp()155     void SetUp() override {
156         nfa_dm_cb.disc_cb.disc_duration = 0;
157     }
TearDown()158     void TearDown() override {
159     }
160 };
161 
TEST_F(NfaDmActGetRfDiscDurationTest,TestDefaultValue)162 TEST_F(NfaDmActGetRfDiscDurationTest, TestDefaultValue) {
163     EXPECT_EQ(nfa_dm_act_get_rf_disc_duration(), 0);
164 }
165 
TEST_F(NfaDmActGetRfDiscDurationTest,TestSetValue)166 TEST_F(NfaDmActGetRfDiscDurationTest, TestSetValue) {
167     nfa_dm_cb.disc_cb.disc_duration = 100;
168     EXPECT_EQ(nfa_dm_act_get_rf_disc_duration(), 100);
169 }
170 
TEST_F(NfaDmActGetRfDiscDurationTest,TestBoundaryValueZero)171 TEST_F(NfaDmActGetRfDiscDurationTest, TestBoundaryValueZero) {
172     nfa_dm_cb.disc_cb.disc_duration = 0;
173     EXPECT_EQ(nfa_dm_act_get_rf_disc_duration(), 0);
174 }
175 
TEST_F(NfaDmActGetRfDiscDurationTest,TestBoundaryValueMax)176 TEST_F(NfaDmActGetRfDiscDurationTest, TestBoundaryValueMax) {
177     nfa_dm_cb.disc_cb.disc_duration = UINT16_MAX;
178     EXPECT_EQ(nfa_dm_act_get_rf_disc_duration(), UINT16_MAX);
179 }
180 
TEST_F(NfaDmActGetRfDiscDurationTest,TestRandomValue)181 TEST_F(NfaDmActGetRfDiscDurationTest, TestRandomValue) {
182     uint16_t random_value = 12345;
183     nfa_dm_cb.disc_cb.disc_duration = random_value;
184     EXPECT_EQ(nfa_dm_act_get_rf_disc_duration(), random_value);
185 }
186 
187 class NfaDmActPowerOffSleepTest : public ::testing::Test {
188 protected:
SetUp()189     void SetUp() override {
190     }
TearDown()191     void TearDown() override {
192     }
193     MOCK_METHOD(void, NFC_SetPowerOffSleep, (bool enable), ());
194 };
195 
TEST_F(NfaDmActPowerOffSleepTest,TestPowerOffSleepFalse)196 TEST_F(NfaDmActPowerOffSleepTest, TestPowerOffSleepFalse) {
197     tNFA_DM_MSG p_data;
198     p_data.hdr.layer_specific = 0;
199     EXPECT_CALL(*this, NFC_SetPowerOffSleep(false)).Times(0);
200     bool result = nfa_dm_act_power_off_sleep(&p_data);
201     EXPECT_TRUE(result);
202 }
203 
TEST_F(NfaDmActPowerOffSleepTest,TestPowerOffSleepTrue)204 TEST_F(NfaDmActPowerOffSleepTest, TestPowerOffSleepTrue) {
205     tNFA_DM_MSG p_data;
206     p_data.hdr.layer_specific = 1;
207     EXPECT_CALL(*this, NFC_SetPowerOffSleep(true)).Times(0);
208     bool result = nfa_dm_act_power_off_sleep(&p_data);
209     EXPECT_TRUE(result);
210 }
211 
TEST_F(NfaDmActPowerOffSleepTest,TestReturnTrue)212 TEST_F(NfaDmActPowerOffSleepTest, TestReturnTrue) {
213     tNFA_DM_MSG p_data;
214     p_data.hdr.layer_specific = 0;
215     bool result = nfa_dm_act_power_off_sleep(&p_data);
216     EXPECT_TRUE(result);
217 }
218 
219 class NfaDmActReleaseExclRfCtrlTest : public ::testing::Test {
220 protected:
SetUp()221     void SetUp() override {
222         nfa_dm_cb.disc_cb.disc_state = NFA_DM_RFST_IDLE;
223         nfa_dm_cb.disc_cb.disc_flags = 0;
224         nfa_dm_cb.disc_cb.kovio_tle.in_use = false;
225     }
TearDown()226     void TearDown() override {
227     }
228 };
229 
TEST_F(NfaDmActReleaseExclRfCtrlTest,TestIdleStateWithWaitingResponse)230 TEST_F(NfaDmActReleaseExclRfCtrlTest, TestIdleStateWithWaitingResponse) {
231     nfa_dm_cb.disc_cb.disc_state = NFA_DM_RFST_IDLE;
232     nfa_dm_cb.disc_cb.disc_flags |= NFA_DM_DISC_FLAGS_W4_RSP;
233     bool result = nfa_dm_act_release_excl_rf_ctrl(nullptr);
234     EXPECT_TRUE(result);
235 }
236 
TEST_F(NfaDmActReleaseExclRfCtrlTest,TestNonIdleStateOrNoWaitingResponse)237 TEST_F(NfaDmActReleaseExclRfCtrlTest, TestNonIdleStateOrNoWaitingResponse) {
238     nfa_dm_cb.disc_cb.disc_state = NFA_DM_RFST_LP_LISTEN;
239     bool result = nfa_dm_act_release_excl_rf_ctrl(nullptr);
240     EXPECT_TRUE(result);
241 }
242 
TEST_F(NfaDmActReleaseExclRfCtrlTest,TestStopKovioTimer)243 TEST_F(NfaDmActReleaseExclRfCtrlTest, TestStopKovioTimer) {
244     nfa_dm_cb.disc_cb.kovio_tle.in_use = true;
245     bool result = nfa_dm_act_release_excl_rf_ctrl(nullptr);
246     EXPECT_TRUE(result);
247 }
248 
TEST_F(NfaDmActReleaseExclRfCtrlTest,TestNoStopKovioTimer)249 TEST_F(NfaDmActReleaseExclRfCtrlTest, TestNoStopKovioTimer) {
250     nfa_dm_cb.disc_cb.kovio_tle.in_use = false;
251     bool result = nfa_dm_act_release_excl_rf_ctrl(nullptr);
252     EXPECT_TRUE(result);
253 }
254 
TEST_F(NfaDmActReleaseExclRfCtrlTest,TestReturnTrue)255 TEST_F(NfaDmActReleaseExclRfCtrlTest, TestReturnTrue) {
256     bool result = nfa_dm_act_release_excl_rf_ctrl(nullptr);
257     EXPECT_TRUE(result);
258 }
259 
conn_callback(uint8_t event,tNFA_CONN_EVT_DATA * conn_evt)260 void conn_callback(uint8_t event, tNFA_CONN_EVT_DATA* conn_evt) {
261     EXPECT_EQ(event, NFA_EXCLUSIVE_RF_CONTROL_STARTED_EVT);
262     EXPECT_EQ(conn_evt->status, NFA_STATUS_OK);
263 }
264 
265 class NfaDmActRequestExclRfCtrlTest : public ::testing::Test {
266 protected:
ResetNfaDmCb()267     void ResetNfaDmCb() {
268         memset(&nfa_dm_cb, 0, sizeof(nfa_dm_cb));
269         nfa_dm_cb.p_excl_conn_cback = nullptr;
270         nfa_dm_cb.disc_cb.disc_state = NFA_DM_RFST_IDLE;
271     }
SetUp()272     void SetUp() override {
273         ResetNfaDmCb();
274     }
275 };
276 
TEST_F(NfaDmActRequestExclRfCtrlTest,CallbackNotSetAndStateIdle)277 TEST_F(NfaDmActRequestExclRfCtrlTest, CallbackNotSetAndStateIdle) {
278     tNFA_DM_MSG msg = {};
279     msg.req_excl_rf_ctrl.p_conn_cback = conn_callback;
280     msg.req_excl_rf_ctrl.p_ndef_cback = nullptr;
281     msg.req_excl_rf_ctrl.poll_mask = 0x01;
282     bool result = nfa_dm_act_request_excl_rf_ctrl(&msg);
283     EXPECT_TRUE(result);
284     EXPECT_EQ(nfa_dm_cb.p_excl_conn_cback, msg.req_excl_rf_ctrl.p_conn_cback);
285     EXPECT_EQ(nfa_dm_cb.flags & NFA_DM_FLAGS_EXCL_RF_ACTIVE, NFA_DM_FLAGS_EXCL_RF_ACTIVE);
286 }
287 
TEST_F(NfaDmActRequestExclRfCtrlTest,ExclusiveDiscoveryStarted)288 TEST_F(NfaDmActRequestExclRfCtrlTest, ExclusiveDiscoveryStarted) {
289     tNFA_DM_MSG msg = {};
290     msg.req_excl_rf_ctrl.poll_mask = 0x01;
291     msg.req_excl_rf_ctrl.listen_cfg = {};
292     msg.req_excl_rf_ctrl.p_conn_cback = conn_callback;
293     bool result = nfa_dm_act_request_excl_rf_ctrl(&msg);
294     EXPECT_TRUE(result);
295     EXPECT_EQ(nfa_dm_cb.p_excl_conn_cback, msg.req_excl_rf_ctrl.p_conn_cback);
296 }
297 
298 #define NFA_PROTOCOL_UNKNOWN 0xFF
299 class NfaDmActSendRawFrameTest : public ::testing::Test {
300 protected:
SetUp()301     void SetUp() override {
302         nfa_dm_cb.disc_cb.disc_state = NFA_DM_RFST_IDLE;
303         nfa_dm_cb.flags = 0;
304         nfa_dm_cb.disc_cb.activated_protocol = NFA_PROTOCOL_T1T;
305         gki_utils = new MockGkiUtils();
306     }
TearDown()307     void TearDown() override { gki_utils = nullptr; }
308 
309     MOCK_METHOD(tNFC_STATUS, nfa_rw_send_raw_frame, (NFC_HDR* p_data), ());
310     MOCK_METHOD(tNFC_STATUS, NFC_SendData, (uint8_t conn_id, NFC_HDR* p_data), ());
311     MOCK_METHOD(void, NFC_SetReassemblyFlag, (bool flag), ());
312 };
313 
TEST_F(NfaDmActSendRawFrameTest,SendRawFrameWhenActive)314 TEST_F(NfaDmActSendRawFrameTest, SendRawFrameWhenActive) {
315     tNFA_DM_MSG msg = {};
316     nfa_dm_cb.disc_cb.disc_state = NFA_DM_RFST_POLL_ACTIVE;
317     EXPECT_CALL(*this, NFC_SendData(NFC_RF_CONN_ID, (NFC_HDR*)&msg)).Times(0);
318     EXPECT_CALL(*this, NFC_SetReassemblyFlag(true)).Times(0);
319     bool result = nfa_dm_act_send_raw_frame(&msg);
320     EXPECT_FALSE(result);
321 }
322 
TEST_F(NfaDmActSendRawFrameTest,SendRawFrameInExclusiveMode)323 TEST_F(NfaDmActSendRawFrameTest, SendRawFrameInExclusiveMode) {
324     tNFA_DM_MSG msg = {};
325     nfa_dm_cb.disc_cb.disc_state = NFA_DM_RFST_POLL_ACTIVE;
326     nfa_dm_cb.flags |= NFA_DM_FLAGS_EXCL_RF_ACTIVE;
327     EXPECT_CALL(*this, NFC_SendData(NFC_RF_CONN_ID, (NFC_HDR*)&msg)).Times(0);
328     EXPECT_CALL(*this, NFC_SetReassemblyFlag(true)).Times(0);
329     bool result = nfa_dm_act_send_raw_frame(&msg);
330     EXPECT_FALSE(result);
331 }
332 
TEST_F(NfaDmActSendRawFrameTest,SendRawFrameInListenActiveState)333 TEST_F(NfaDmActSendRawFrameTest, SendRawFrameInListenActiveState) {
334     tNFA_DM_MSG msg = {};
335     nfa_dm_cb.disc_cb.disc_state = NFA_DM_RFST_LISTEN_ACTIVE;
336     EXPECT_CALL(*this, NFC_SendData(NFC_RF_CONN_ID, (NFC_HDR*)&msg)).Times(0);
337     EXPECT_CALL(*this, NFC_SetReassemblyFlag(true)).Times(0);
338     bool result = nfa_dm_act_send_raw_frame(&msg);
339     EXPECT_FALSE(result);
340 }
341 
TEST_F(NfaDmActSendRawFrameTest,SendRawFrameWithUnsupportedProtocol)342 TEST_F(NfaDmActSendRawFrameTest, SendRawFrameWithUnsupportedProtocol) {
343     tNFA_DM_MSG msg = {};
344     nfa_dm_cb.disc_cb.disc_state = NFA_DM_RFST_POLL_ACTIVE;
345     nfa_dm_cb.disc_cb.activated_protocol = NFA_PROTOCOL_UNKNOWN;
346     EXPECT_CALL(*this, NFC_SendData(NFC_RF_CONN_ID, (NFC_HDR*)&msg)).Times(0);
347     EXPECT_CALL(*this, NFC_SetReassemblyFlag(true)).Times(0);
348     bool result = nfa_dm_act_send_raw_frame(&msg);
349     EXPECT_FALSE(result);
350 }
351 
TEST_F(NfaDmActSendRawFrameTest,SendRawFrameWithProtocolT1T)352 TEST_F(NfaDmActSendRawFrameTest, SendRawFrameWithProtocolT1T) {
353     tNFA_DM_MSG msg = {};
354     nfa_dm_cb.disc_cb.disc_state = NFA_DM_RFST_POLL_ACTIVE;
355     nfa_dm_cb.disc_cb.activated_protocol = NFA_PROTOCOL_T1T;
356     EXPECT_CALL(*this, nfa_rw_send_raw_frame((NFC_HDR*)&msg)).Times(0);
357     EXPECT_CALL(*this, NFC_SetReassemblyFlag(true)).Times(0);
358     bool result = nfa_dm_act_send_raw_frame(&msg);
359     EXPECT_FALSE(result);
360 }
361 
TEST_F(NfaDmActSendRawFrameTest,SendRawFrameNfcSendDataFails)362 TEST_F(NfaDmActSendRawFrameTest, SendRawFrameNfcSendDataFails) {
363     tNFA_DM_MSG msg = {};
364     nfa_dm_cb.disc_cb.disc_state = NFA_DM_RFST_POLL_ACTIVE;
365     nfa_dm_cb.disc_cb.activated_protocol = NFA_PROTOCOL_T1T;
366     EXPECT_CALL(*this, NFC_SetReassemblyFlag(true)).Times(0);
367     bool result = nfa_dm_act_send_raw_frame(&msg);
368     EXPECT_FALSE(result);
369 }
370 
TEST_F(NfaDmActSendRawFrameTest,SendRawFrameWhenInactive)371 TEST_F(NfaDmActSendRawFrameTest, SendRawFrameWhenInactive) {
372     tNFA_DM_MSG msg = {};
373     nfa_dm_cb.disc_cb.disc_state = NFA_DM_RFST_IDLE;
374     EXPECT_CALL(*this, NFC_SetReassemblyFlag(true)).Times(0);
375     bool result = nfa_dm_act_send_raw_frame(&msg);
376     EXPECT_TRUE(result);
377 }
378 
379 class NfaDmActSendVscTest : public ::testing::Test {
380 protected:
SetUp()381  void SetUp() override { gki_utils = new MockGkiUtils(); }
TearDown()382  void TearDown() override { gki_utils = nullptr; }
383  MOCK_METHOD(void, NFC_SendVsCommand,
384              (uint8_t oid, NFC_HDR* p_cmd, tNFA_DM_CBACK* p_cback), ());
385 };
386 
TEST_F(NfaDmActSendVscTest,ValidCommandParams)387 TEST_F(NfaDmActSendVscTest, ValidCommandParams) {
388     tNFA_DM_MSG msg = {};
389     msg.send_vsc.cmd_params_len = 10;
390     msg.send_vsc.oid = 0x01;
391     msg.send_vsc.p_cback = nullptr;
392     NFC_HDR p_cmd = {};
393     p_cmd.offset = sizeof(tNFA_DM_API_SEND_VSC) - NFC_HDR_SIZE;
394     p_cmd.len = 10;
395     EXPECT_CALL(*this, NFC_SendVsCommand(0x01, &p_cmd, nullptr)).Times(0);
396     bool result = nfa_dm_act_send_vsc(&msg);
397     EXPECT_FALSE(result);
398 }
399 
TEST_F(NfaDmActSendVscTest,ZeroLengthCommand)400 TEST_F(NfaDmActSendVscTest, ZeroLengthCommand) {
401     tNFA_DM_MSG msg = {};
402     msg.send_vsc.cmd_params_len = 0;
403     msg.send_vsc.oid = 0x01;
404     msg.send_vsc.p_cback = nullptr;
405     NFC_HDR p_cmd = {};
406     p_cmd.offset = sizeof(tNFA_DM_API_SEND_VSC) - NFC_HDR_SIZE;
407     p_cmd.len = 0;
408     EXPECT_CALL(*this, NFC_SendVsCommand(0x01, &p_cmd, nullptr)).Times(0);
409     bool result = nfa_dm_act_send_vsc(&msg);
410     EXPECT_FALSE(result);
411 }
412 
TEST_F(NfaDmActSendVscTest,InvalidCallback)413 TEST_F(NfaDmActSendVscTest, InvalidCallback) {
414     tNFA_DM_MSG msg = {};
415     msg.send_vsc.cmd_params_len = 10;
416     msg.send_vsc.oid = 0x01;
417     msg.send_vsc.p_cback = nullptr;
418     NFC_HDR p_cmd = {};
419     p_cmd.offset = sizeof(tNFA_DM_API_SEND_VSC) - NFC_HDR_SIZE;
420     p_cmd.len = 10;
421     EXPECT_CALL(*this, NFC_SendVsCommand(0x01, &p_cmd, nullptr)).Times(0);
422     bool result = nfa_dm_act_send_vsc(&msg);
423     EXPECT_FALSE(result);
424 }
425 
TEST_F(NfaDmActSendVscTest,BufferNotFreedByNfaSys)426 TEST_F(NfaDmActSendVscTest, BufferNotFreedByNfaSys) {
427     tNFA_DM_MSG msg = {};
428     msg.send_vsc.cmd_params_len = 10;
429     msg.send_vsc.oid = 0x01;
430     msg.send_vsc.p_cback = nullptr;
431     EXPECT_CALL(*this, NFC_SendVsCommand(0x01, testing::NotNull(), nullptr)).Times(0);
432     bool result = nfa_dm_act_send_vsc(&msg);
433     EXPECT_FALSE(result);
434 }
435 
TEST_F(NfaDmActSendVscTest,DifferentParams)436 TEST_F(NfaDmActSendVscTest, DifferentParams) {
437     tNFA_DM_MSG msg = {};
438     msg.send_vsc.cmd_params_len = 20;
439     msg.send_vsc.oid = 0x02;
440     msg.send_vsc.p_cback = nullptr;
441     NFC_HDR p_cmd = {};
442     p_cmd.offset = sizeof(tNFA_DM_API_SEND_VSC) - NFC_HDR_SIZE;
443     p_cmd.len = 20;
444     EXPECT_CALL(*this, NFC_SendVsCommand(0x02, &p_cmd, nullptr)).Times(0);
445     bool result = nfa_dm_act_send_vsc(&msg);
446     EXPECT_FALSE(result);
447 }
448 
449 class NfaDmActUpdateRfParamsTest : public ::testing::Test {
450 protected:
SetUp()451     void SetUp() override {
452     }
TearDown()453     void TearDown() override {
454     }
455     MOCK_METHOD(tNFC_STATUS, NFC_UpdateRFCommParams, (tNFA_RF_COMM_PARAMS* params), ());
456     MOCK_METHOD(void, nfa_dm_conn_cback_event_notify, (
457             tNFA_EE_EVT event, tNFA_CONN_EVT_DATA* conn_evt), ());
458 };
459 
TEST_F(NfaDmActUpdateRfParamsTest,ValidRfParams)460 TEST_F(NfaDmActUpdateRfParamsTest, ValidRfParams) {
461     tNFA_DM_MSG msg = {};
462     msg.update_rf_params.params = {};
463     EXPECT_CALL(*this, nfa_dm_conn_cback_event_notify(testing::_, testing::_)).Times(0);
464     bool result = nfa_dm_act_update_rf_params(&msg);
465     EXPECT_TRUE(result);
466 }
467 
TEST_F(NfaDmActUpdateRfParamsTest,FailedRfParamsUpdate)468 TEST_F(NfaDmActUpdateRfParamsTest, FailedRfParamsUpdate) {
469     tNFA_DM_MSG msg = {};
470     msg.update_rf_params.params = {};
471     tNFA_CONN_EVT_DATA conn_evt;
472     conn_evt.status = NFA_STATUS_FAILED;
473     EXPECT_CALL(*this, nfa_dm_conn_cback_event_notify(
474             NFA_UPDATE_RF_PARAM_RESULT_EVT, &conn_evt)).Times(0);
475     bool result = nfa_dm_act_update_rf_params(&msg);
476     EXPECT_TRUE(result);
477 }
478 
TEST_F(NfaDmActUpdateRfParamsTest,AlwaysReturnTrue)479 TEST_F(NfaDmActUpdateRfParamsTest, AlwaysReturnTrue) {
480     tNFA_DM_MSG msg = {};
481     msg.update_rf_params.params = {};
482     bool result = nfa_dm_act_update_rf_params(&msg);
483     EXPECT_TRUE(result);
484 }
485 
TEST_F(NfaDmActUpdateRfParamsTest,CorrectEventAndStatusOnFailure)486 TEST_F(NfaDmActUpdateRfParamsTest, CorrectEventAndStatusOnFailure) {
487     tNFA_DM_MSG msg = {};
488     msg.update_rf_params.params = {};
489     tNFA_CONN_EVT_DATA conn_evt;
490     conn_evt.status = NFA_STATUS_FAILED;
491     EXPECT_CALL(*this, nfa_dm_conn_cback_event_notify(
492             NFA_UPDATE_RF_PARAM_RESULT_EVT, &conn_evt)).Times(0);
493     bool result = nfa_dm_act_update_rf_params(&msg);
494     EXPECT_TRUE(result);
495 }
496 
497 class NfaDmRevtTest : public ::testing::Test {
498 protected:
SetUp()499     void SetUp() override {
500     }
TearDown()501     void TearDown() override {
502     }
503 };
504 
TEST_F(NfaDmRevtTest,ConvertNfcRevtToStr)505 TEST_F(NfaDmRevtTest, ConvertNfcRevtToStr) {
506     EXPECT_EQ(nfa_dm_nfc_revt_2_str(NFC_ENABLE_REVT), "NFC_ENABLE_REVT");
507     EXPECT_EQ(nfa_dm_nfc_revt_2_str(NFC_DISABLE_REVT), "NFC_DISABLE_REVT");
508     EXPECT_EQ(nfa_dm_nfc_revt_2_str(NFC_SET_CONFIG_REVT), "NFC_SET_CONFIG_REVT");
509     EXPECT_EQ(nfa_dm_nfc_revt_2_str(NFC_GET_CONFIG_REVT), "NFC_GET_CONFIG_REVT");
510     EXPECT_EQ(nfa_dm_nfc_revt_2_str(NFC_NFCEE_DISCOVER_REVT), "NFC_NFCEE_DISCOVER_REVT");
511     EXPECT_EQ(nfa_dm_nfc_revt_2_str(NFC_NFCEE_INFO_REVT), "NFC_NFCEE_INFO_REVT");
512     EXPECT_EQ(nfa_dm_nfc_revt_2_str(NFC_NFCEE_MODE_SET_REVT), "NFC_NFCEE_MODE_SET_REVT");
513     EXPECT_EQ(nfa_dm_nfc_revt_2_str(NFC_NFCEE_PL_CONTROL_REVT), "NFC_NFCEE_PL_CONTROL_REVT");
514     EXPECT_EQ(nfa_dm_nfc_revt_2_str(NFC_RF_FIELD_REVT), "NFC_RF_FIELD_REVT");
515     EXPECT_EQ(nfa_dm_nfc_revt_2_str(NFC_EE_ACTION_REVT), "NFC_EE_ACTION_REVT");
516     EXPECT_EQ(nfa_dm_nfc_revt_2_str(NFC_EE_DISCOVER_REQ_REVT), "NFC_EE_DISCOVER_REQ_REVT");
517     EXPECT_EQ(nfa_dm_nfc_revt_2_str(NFC_SET_ROUTING_REVT), "NFC_SET_ROUTING_REVT");
518     EXPECT_EQ(nfa_dm_nfc_revt_2_str(NFC_GET_ROUTING_REVT), "NFC_GET_ROUTING_REVT");
519     EXPECT_EQ(nfa_dm_nfc_revt_2_str(NFC_GEN_ERROR_REVT), "NFC_GEN_ERROR_REVT");
520     EXPECT_EQ(nfa_dm_nfc_revt_2_str(NFC_NFCC_RESTART_REVT), "NFC_NFCC_RESTART_REVT");
521     EXPECT_EQ(nfa_dm_nfc_revt_2_str(NFC_NFCC_TIMEOUT_REVT), "NFC_NFCC_TIMEOUT_REVT");
522     EXPECT_EQ(nfa_dm_nfc_revt_2_str(NFC_NFCC_TRANSPORT_ERR_REVT), "NFC_NFCC_TRANSPORT_ERR_REVT");
523     EXPECT_EQ(nfa_dm_nfc_revt_2_str(NFC_NFCC_POWER_OFF_REVT), "NFC_NFCC_POWER_OFF_REVT");
524     EXPECT_EQ(nfa_dm_nfc_revt_2_str(NFC_NFCEE_STATUS_REVT), "NFC_NFCEE_STATUS_REVT");
525     EXPECT_EQ(nfa_dm_nfc_revt_2_str(static_cast<tNFC_RESPONSE_EVT>(999)), "unknown revt");
526 }
527 
528 class NfaDmNotifyActivationStatusTest : public ::testing::Test {
529 protected:
SetUp()530     void SetUp() override {
531         memset(&nfa_dm_cb, 0, sizeof(nfa_dm_cb));
532         nfa_dm_cb.p_activate_ntf = nullptr;
533         nfa_dm_cb.disc_cb.activated_protocol = NFC_PROTOCOL_T1T;
534     }
TearDown()535     void TearDown() override {
536     }
537     MOCK_METHOD(void, nfa_dm_conn_cback_event_notify, (
538             uint8_t event, tNFA_CONN_EVT_DATA* p_data), ());
539     MOCK_METHOD(void, nfa_dm_rf_deactivate, (tNFA_DEACTIVATE_TYPE deact_type), ());
540 };
541 
TEST_F(NfaDmNotifyActivationStatusTest,TestNullActivateNtf)542 TEST_F(NfaDmNotifyActivationStatusTest, TestNullActivateNtf) {
543     tNFA_STATUS status = NFA_STATUS_OK;
544     tNFA_TAG_PARAMS params;
545     nfa_dm_notify_activation_status(status, &params);
546     EXPECT_CALL(*this, nfa_dm_conn_cback_event_notify(testing::_, testing::_)).Times(0);
547 }
548 
TEST_F(NfaDmNotifyActivationStatusTest,TestActivationWithoutParams)549 TEST_F(NfaDmNotifyActivationStatusTest, TestActivationWithoutParams) {
550     tNFA_STATUS status = NFA_STATUS_OK;
551     tNFA_TAG_PARAMS* p_params = nullptr;
552     EXPECT_CALL(*this, nfa_dm_conn_cback_event_notify(NFA_ACTIVATED_EVT, testing::_)).Times(0);
553     nfa_dm_notify_activation_status(status, p_params);
554     delete nfa_dm_cb.p_activate_ntf;
555     nfa_dm_cb.p_activate_ntf = nullptr;
556 }
557 
TEST_F(NfaDmNotifyActivationStatusTest,TestInvalidStatus)558 TEST_F(NfaDmNotifyActivationStatusTest, TestInvalidStatus) {
559     tNFA_STATUS status = NFA_STATUS_FAILED;
560     tNFA_TAG_PARAMS params;
561     EXPECT_CALL(*this, nfa_dm_rf_deactivate(NFA_DEACTIVATE_TYPE_DISCOVERY)).Times(0);
562     EXPECT_CALL(*this, nfa_dm_conn_cback_event_notify(testing::_, testing::_)).Times(0);
563     nfa_dm_notify_activation_status(status, &params);
564     delete nfa_dm_cb.p_activate_ntf;
565     nfa_dm_cb.p_activate_ntf = nullptr;
566 }
567 
568 class NfaDmPollDiscCbackTest : public ::testing::Test {
569 protected:
SetUp()570     void SetUp() override {
571         memset(&nfa_dm_cb, 0, sizeof(nfa_dm_cb));
572     }
TearDown()573     void TearDown() override {
574         if (nfa_dm_cb.p_activate_ntf) {
575             GKI_freebuf(nfa_dm_cb.p_activate_ntf);
576         }
577     }
578     MOCK_METHOD(void, nfa_dm_conn_cback_event_notify, (
579             uint8_t event, tNFA_CONN_EVT_DATA* p_data), ());
580     MOCK_METHOD(void, nfa_rw_proc_disc_evt, (
581             tNFA_DM_RF_DISC_EVT event, tNFC_DISCOVER* p_data, bool notify), ());
582     MOCK_METHOD(void, NFC_SetStaticRfCback, (void* cback), ());
583     MOCK_METHOD(void, nfa_dm_rf_deactivate, (tNFA_DEACTIVATE_TYPE deact_type), ());
584     MOCK_METHOD(void, nfa_dm_delete_rf_discover, (tNFA_HANDLE handle), ());
585 };
586 
TEST_F(NfaDmPollDiscCbackTest,TestStartEvent)587 TEST_F(NfaDmPollDiscCbackTest, TestStartEvent) {
588     tNFA_DM_RF_DISC_EVT event = NFA_DM_RF_DISC_START_EVT;
589     tNFC_DISCOVER p_data = {};
590     EXPECT_CALL(*this, nfa_dm_conn_cback_event_notify(testing::_, testing::_)).Times(0);
591     nfa_dm_poll_disc_cback(event, &p_data);
592 }
593 
TEST_F(NfaDmPollDiscCbackTest,TestDeactivatedEventNoEventPending)594 TEST_F(NfaDmPollDiscCbackTest, TestDeactivatedEventNoEventPending) {
595     tNFA_DM_RF_DISC_EVT event = NFA_DM_RF_DISC_DEACTIVATED_EVT;
596     tNFC_DISCOVER p_data = {};
597     p_data.deactivate.type = NFC_DEACTIVATE_TYPE_IDLE;
598     nfa_dm_cb.flags = 0;
599     EXPECT_CALL(*this, nfa_dm_conn_cback_event_notify(testing::_, testing::_)).Times(0);
600     nfa_dm_poll_disc_cback(event, &p_data);
601 }
602 
603 class NfaDmPollDiscCbackWrapperTest : public testing::Test {
604 protected:
605 };
606 
TEST_F(NfaDmPollDiscCbackWrapperTest,TestValidEventAndData)607 TEST_F(NfaDmPollDiscCbackWrapperTest, TestValidEventAndData) {
608     tNFA_DM_RF_DISC_EVT event = NFA_DM_RF_DISC_START_EVT;
609     tNFC_DISCOVER data;
610     tNFC_DISCOVER* p_data = &data;
611     nfa_dm_poll_disc_cback_dta_wrapper(NFA_DM_RF_DISC_START_EVT, p_data);
612 }
613 
TEST_F(NfaDmPollDiscCbackWrapperTest,TestNullData)614 TEST_F(NfaDmPollDiscCbackWrapperTest, TestNullData) {
615     tNFA_DM_RF_DISC_EVT event = NFA_DM_RF_DISC_START_EVT;
616     tNFC_DISCOVER *p_data = nullptr;
617     nfa_dm_poll_disc_cback_dta_wrapper(event, p_data);
618 }
619 
620 class NfaDmProcNfccPowerModeTest : public ::testing::Test {
621 protected:
SetUp()622     void SetUp() override {
623         memset(&nfa_dm_cb, 0, sizeof(nfa_dm_cb));
624     }
TearDown()625     void TearDown() override {
626     }
627     MOCK_METHOD(void, nfa_sys_cback_notify_nfcc_power_mode_proc_complete, (uint8_t id), ());
628 };
629 
TEST_F(NfaDmProcNfccPowerModeTest,TestFullPowerMode)630 TEST_F(NfaDmProcNfccPowerModeTest, TestFullPowerMode) {
631     uint8_t nfcc_power_mode = NFA_DM_PWR_MODE_FULL;
632     nfa_dm_proc_nfcc_power_mode(nfcc_power_mode);
633     EXPECT_EQ(nfa_dm_cb.setcfg_pending_mask, 0);
634     EXPECT_EQ(nfa_dm_cb.setcfg_pending_num, 0);
635     EXPECT_EQ(nfa_dm_cb.flags & NFA_DM_FLAGS_POWER_OFF_SLEEP, 0);
636     EXPECT_CALL(*this, nfa_sys_cback_notify_nfcc_power_mode_proc_complete(NFA_ID_DM)).Times(0);
637 }
638 
TEST_F(NfaDmProcNfccPowerModeTest,TestOffSleepMode)639 TEST_F(NfaDmProcNfccPowerModeTest, TestOffSleepMode) {
640     uint8_t nfcc_power_mode = NFA_DM_PWR_MODE_OFF_SLEEP;
641     nfa_dm_proc_nfcc_power_mode(nfcc_power_mode);
642     EXPECT_EQ(nfa_dm_cb.setcfg_pending_mask, 0);
643     EXPECT_EQ(nfa_dm_cb.setcfg_pending_num, 0);
644     EXPECT_NE(nfa_dm_cb.flags & NFA_DM_FLAGS_POWER_OFF_SLEEP, 0);
645     EXPECT_CALL(*this, nfa_sys_cback_notify_nfcc_power_mode_proc_complete(NFA_ID_DM)).Times(0);
646 }
647 
TEST_F(NfaDmProcNfccPowerModeTest,TestInvalidPowerMode)648 TEST_F(NfaDmProcNfccPowerModeTest, TestInvalidPowerMode) {
649     uint8_t nfcc_power_mode = 99;
650     nfa_dm_proc_nfcc_power_mode(nfcc_power_mode);
651     EXPECT_EQ(nfa_dm_cb.setcfg_pending_mask, 0);
652     EXPECT_EQ(nfa_dm_cb.setcfg_pending_num, 0);
653     EXPECT_EQ(nfa_dm_cb.flags & NFA_DM_FLAGS_POWER_OFF_SLEEP, 0);
654     EXPECT_CALL(*this, nfa_sys_cback_notify_nfcc_power_mode_proc_complete(NFA_ID_DM)).Times(0);
655 }
dummy_conn_callback(unsigned char event,tNFA_CONN_EVT_DATA * data)656 void dummy_conn_callback(
657         [[maybe_unused]] unsigned char event, [[maybe_unused]] tNFA_CONN_EVT_DATA* data) {
658 }
dummy_ndef_callback(unsigned char event,tNFA_NDEF_EVT_DATA * data)659 void dummy_ndef_callback(
660         [[maybe_unused]] unsigned char event, [[maybe_unused]] tNFA_NDEF_EVT_DATA* data) {
661 }
662 
663 class NfaDmRelExclRfControlAndNotifyTest : public ::testing::Test {
664 protected:
SetUp()665     void SetUp() override {
666         memset(&nfa_dm_cb, 0, sizeof(nfa_dm_cb));
667     }
668 };
669 
TEST(NfaDmRelExclRfControlAndNotifyTest,TestNormalScenario)670 TEST(NfaDmRelExclRfControlAndNotifyTest, TestNormalScenario) {
671     nfa_dm_cb.flags = NFA_DM_FLAGS_EXCL_RF_ACTIVE;
672     nfa_dm_cb.p_excl_conn_cback = &dummy_conn_callback;
673     nfa_dm_cb.p_excl_ndef_cback = &dummy_ndef_callback;
674     nfa_dm_rel_excl_rf_control_and_notify();
675     EXPECT_EQ(nfa_dm_cb.flags & NFA_DM_FLAGS_EXCL_RF_ACTIVE, 0);
676     EXPECT_EQ(nfa_dm_cb.p_excl_conn_cback, nullptr);
677     EXPECT_EQ(nfa_dm_cb.p_excl_ndef_cback, nullptr);
678 }
679 
TEST(NfaDmRelExclRfControlAndNotifyTest,TestCallbacksReset)680 TEST(NfaDmRelExclRfControlAndNotifyTest, TestCallbacksReset) {
681     nfa_dm_cb.p_excl_conn_cback = &dummy_conn_callback;
682     nfa_dm_cb.p_excl_ndef_cback = &dummy_ndef_callback;
683     nfa_dm_rel_excl_rf_control_and_notify();
684     EXPECT_EQ(nfa_dm_cb.p_excl_conn_cback, nullptr);
685     EXPECT_EQ(nfa_dm_cb.p_excl_ndef_cback, nullptr);
686 }
687 
TEST(NfaDmRelExclRfControlAndNotifyTest,TestNoActionOnNoFlagSet)688 TEST(NfaDmRelExclRfControlAndNotifyTest, TestNoActionOnNoFlagSet) {
689     nfa_dm_cb.flags = 0;
690     nfa_dm_cb.p_excl_conn_cback = &dummy_conn_callback;
691     nfa_dm_cb.p_excl_ndef_cback = &dummy_ndef_callback;
692     nfa_dm_rel_excl_rf_control_and_notify();
693     EXPECT_EQ(nfa_dm_cb.flags, 0);
694     EXPECT_EQ(nfa_dm_cb.p_excl_conn_cback, nullptr);
695     EXPECT_EQ(nfa_dm_cb.p_excl_ndef_cback, nullptr);
696 }
697 
698 class NfaDmModuleInitTest : public ::testing::Test {
699 protected:
700 };
701 
TestCallback(uint8_t event,tNFA_DM_CBACK_DATA * data)702 void TestCallback(uint8_t event, tNFA_DM_CBACK_DATA* data) {
703     EXPECT_EQ(event, NFA_DM_ENABLE_EVT);
704     EXPECT_EQ(data->status, NFA_STATUS_OK);
705 }
706 
TEST_F(NfaDmModuleInitTest,FlagsAreCleared)707 TEST_F(NfaDmModuleInitTest, FlagsAreCleared) {
708     nfa_dm_cb.flags = NFA_DM_FLAGS_ENABLE_EVT_PEND;
709     nfa_dm_cb.p_dm_cback = TestCallback;
710     nfa_dm_module_init_cback();
711     EXPECT_EQ(nfa_dm_cb.flags & NFA_DM_FLAGS_ENABLE_EVT_PEND, 0);
712 }
713 
TEST_F(NfaDmModuleInitTest,CallbackInvokedWithCorrectData)714 TEST_F(NfaDmModuleInitTest, CallbackInvokedWithCorrectData) {
715     nfa_dm_cb.flags = NFA_DM_FLAGS_ENABLE_EVT_PEND;
716     nfa_dm_cb.p_dm_cback = TestCallback;
717     nfa_dm_module_init_cback();
718 }
719 
720 class NfaDmSysEnableTest : public ::testing::Test {
721 protected:
722 };
723 
TEST_F(NfaDmSysEnableTest,CallsNfaDmSetInitNciParamsOnce)724 TEST_F(NfaDmSysEnableTest, CallsNfaDmSetInitNciParamsOnce) {
725     nfa_dm_sys_enable();
726     EXPECT_TRUE(true);
727 }
728 
TEST_F(NfaDmSysEnableTest,CallsNfaDmSetInitNciParamsMultipleTimes)729 TEST_F(NfaDmSysEnableTest, CallsNfaDmSetInitNciParamsMultipleTimes) {
730     nfa_dm_sys_enable();
731     nfa_dm_sys_enable();
732     EXPECT_TRUE(true);
733 }
734 
735 class MockNfaSys {
736 public:
737     MOCK_METHOD(void, nfa_sys_stop_timer, (TIMER_LIST_ENT* p_tle), ());
738 };
739 
740 class MockNfaDm {
741 public:
742     MOCK_METHOD(void, nfa_dm_ndef_dereg_all, (), ());
743 };
744 
745 class NfaDmDisableCompleteTest : public testing::Test {
746 protected:
SetUp()747     void SetUp() override {
748         nfa_dm_cb.flags = 0;
749         nfa_dm_cb.p_dm_cback = nullptr;
750         nfa_dm_cb.tle = TIMER_LIST_ENT();
751         mock_nfa_sys = std::make_unique<MockNfaSys>();
752         mock_nfa_dm = std::make_unique<MockNfaDm>();
753     }
754 
TearDown()755     void TearDown() override {
756         testing::Mock::VerifyAndClearExpectations(mock_nfa_sys.get());
757         testing::Mock::VerifyAndClearExpectations(mock_nfa_dm.get());
758     }
759     std::unique_ptr<MockNfaSys> mock_nfa_sys;
760     std::unique_ptr<MockNfaDm> mock_nfa_dm;
761 };
762 
TEST_F(NfaDmDisableCompleteTest,FlagsUpdatedCorrectly)763 TEST_F(NfaDmDisableCompleteTest, FlagsUpdatedCorrectly) {
764     nfa_dm_disable_complete();
765     EXPECT_EQ(nfa_dm_cb.flags & NFA_DM_FLAGS_DM_DISABLING_NFC, NFA_DM_FLAGS_DM_DISABLING_NFC);
766 }
767 
TEST_F(NfaDmDisableCompleteTest,FunctionsCalledWhenFlagNotSet)768 TEST_F(NfaDmDisableCompleteTest, FunctionsCalledWhenFlagNotSet) {
769     nfa_dm_cb.flags = 0;
770     EXPECT_CALL(*mock_nfa_sys, nfa_sys_stop_timer(&nfa_dm_cb.tle)).Times(0);
771     EXPECT_CALL(*mock_nfa_dm, nfa_dm_ndef_dereg_all()).Times(0);
772     nfa_dm_disable_complete();
773 }
774 
TEST_F(NfaDmDisableCompleteTest,NoActionsWhenFlagAlreadySet)775 TEST_F(NfaDmDisableCompleteTest, NoActionsWhenFlagAlreadySet) {
776     nfa_dm_cb.flags = NFA_DM_FLAGS_DM_DISABLING_NFC;
777     EXPECT_CALL(*mock_nfa_sys, nfa_sys_stop_timer(&nfa_dm_cb.tle)).Times(0);
778     EXPECT_CALL(*mock_nfa_dm, nfa_dm_ndef_dereg_all()).Times(0);
779     nfa_dm_disable_complete();
780 }
781 
782 class MockDmGet {
783 public:
784     MOCK_METHOD(void, NFC_GetConfig, (uint8_t num_ids, uint8_t* p_pmids), ());
785 };
786 
787 class NfaDmGetConfigTest : public testing::Test {
788 protected:
SetUp()789     void SetUp() override {
790         p_data = new tNFA_DM_MSG();
791         mock_dm_get = std::make_unique<MockDmGet>();
792     }
793 
TearDown()794     void TearDown() override {
795         delete p_data;
796         testing::Mock::VerifyAndClearExpectations(mock_dm_get.get());
797     }
798     tNFA_DM_MSG* p_data;
799     std::unique_ptr<MockDmGet> mock_dm_get;
800 };
801 
TEST_F(NfaDmGetConfigTest,ValidInputCallsNFCGetConfig)802 TEST_F(NfaDmGetConfigTest, ValidInputCallsNFCGetConfig) {
803     uint8_t num_ids = 3;
804     uint8_t pmids[] = {10, 20, 30};
805     p_data->getconfig.num_ids = num_ids;
806     p_data->getconfig.p_pmids = pmids;
807     EXPECT_CALL(*mock_dm_get, NFC_GetConfig(num_ids, pmids)).Times(0);
808     bool result = nfa_dm_get_config(p_data);
809     EXPECT_TRUE(result);
810 }
811 
TEST_F(NfaDmGetConfigTest,ZeroNumIds)812 TEST_F(NfaDmGetConfigTest, ZeroNumIds) {
813     p_data->getconfig.num_ids = 0;
814     p_data->getconfig.p_pmids = nullptr;
815     EXPECT_CALL(*mock_dm_get, NFC_GetConfig(0, nullptr)).Times(0);
816     bool result = nfa_dm_get_config(p_data);
817     EXPECT_TRUE(result);
818 }
819 
TEST_F(NfaDmGetConfigTest,DifferentValidConfig)820 TEST_F(NfaDmGetConfigTest, DifferentValidConfig) {
821     uint8_t num_ids = 2;
822     uint8_t pmids[] = {100, 200};
823     p_data->getconfig.num_ids = num_ids;
824     p_data->getconfig.p_pmids = pmids;
825     EXPECT_CALL(*mock_dm_get, NFC_GetConfig(num_ids, pmids)).Times(0);
826     bool result = nfa_dm_get_config(p_data);
827     EXPECT_TRUE(result);
828 }
829 
830