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, ¶ms);
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, ¶ms);
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