• 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 <gtest/gtest.h>
18 #include <gmock/gmock.h>
19 #include "nfa_dm_api.cc"
20 
21 #ifdef NFA_STATUS_FAILED
22 #undef NFA_STATUS_FAILED
23 #endif
24 #define NFA_STATUS_FAILED 0x00
25 
26 class NFADeactivateTest : public ::testing::Test {
27 protected:
SetUp()28     void SetUp() override {
29     }
TearDown()30     void TearDown() override {
31     }
32 };
TEST_F(NFADeactivateTest,Deactivate_SleepMode_Success)33 TEST_F(NFADeactivateTest, Deactivate_SleepMode_Success) {
34     bool sleep_mode = true;
35     tNFA_STATUS result = NFA_Deactivate(sleep_mode);
36     EXPECT_EQ(result, NFA_STATUS_OK);
37 }
38 
TEST_F(NFADeactivateTest,Deactivate_NonSleepMode_Success)39 TEST_F(NFADeactivateTest, Deactivate_NonSleepMode_Success) {
40     bool sleep_mode = false;
41     tNFA_STATUS result = NFA_Deactivate(sleep_mode);
42     EXPECT_EQ(result, NFA_STATUS_OK);
43 }
44 
TEST_F(NFADeactivateTest,Deactivate_BufferAllocationFailure)45 TEST_F(NFADeactivateTest, Deactivate_BufferAllocationFailure) {
46     bool sleep_mode = true;
47     tNFA_STATUS result = NFA_Deactivate(sleep_mode);
48     EXPECT_EQ(result, NFA_STATUS_FAILED);
49 }
50 
TEST_F(NFADeactivateTest,Deactivate_MultipleRequests)51 TEST_F(NFADeactivateTest, Deactivate_MultipleRequests) {
52     auto* mock_msg1 = new tNFA_DM_API_DEACTIVATE();
53     auto* mock_msg2 = new tNFA_DM_API_DEACTIVATE();
54     EXPECT_EQ(NFA_Deactivate(true), NFA_STATUS_OK);
55     EXPECT_EQ(NFA_Deactivate(false), NFA_STATUS_OK);
56 }
57 
TEST_F(NFADeactivateTest,Deactivate_BufferFailureStressTest)58 TEST_F(NFADeactivateTest, Deactivate_BufferFailureStressTest) {
59     for (int i = 0; i < 5; ++i) {
60         EXPECT_EQ(NFA_Deactivate(true), NFA_STATUS_FAILED);
61         EXPECT_EQ(NFA_Deactivate(false), NFA_STATUS_FAILED);
62     }
63 }
64 
65 //tests for NFA_DeregisterNDefTypeHandler()
66 
TEST_F(NFADeactivateTest,Deregistration_Success)67 TEST_F(NFADeactivateTest, Deregistration_Success) {
68     tNFA_HANDLE ndef_type_handle = 1;
69     tNFA_DM_API_DEREG_NDEF_HDLR mock_msg = {};
70     mock_msg.hdr.event = NFA_DM_API_DEREG_NDEF_HDLR_EVT;
71     mock_msg.ndef_type_handle = ndef_type_handle;
72     tNFA_STATUS result = NFA_DeregisterNDefTypeHandler(ndef_type_handle);
73     EXPECT_EQ(result, NFA_STATUS_OK);
74     EXPECT_EQ(mock_msg.hdr.event, NFA_DM_API_DEREG_NDEF_HDLR_EVT);
75     EXPECT_EQ(mock_msg.ndef_type_handle, ndef_type_handle);
76 }
77 
TEST_F(NFADeactivateTest,Deregistration_BufferAllocationFailure)78 TEST_F(NFADeactivateTest, Deregistration_BufferAllocationFailure) {
79     tNFA_HANDLE ndef_type_handle = 0x02;
80     tNFA_STATUS result = NFA_DeregisterNDefTypeHandler(ndef_type_handle);
81     EXPECT_EQ(result, NFA_STATUS_FAILED);
82 }
83 
TEST_F(NFADeactivateTest,Deregistration_EventAssignment)84 TEST_F(NFADeactivateTest, Deregistration_EventAssignment) {
85     tNFA_HANDLE ndef_type_handle = 1;
86     tNFA_DM_API_DEREG_NDEF_HDLR mock_msg = {};
87     mock_msg.hdr.event = NFA_DM_API_DEREG_NDEF_HDLR_EVT;
88     mock_msg.ndef_type_handle = ndef_type_handle;
89     tNFA_STATUS result = NFA_DeregisterNDefTypeHandler(ndef_type_handle);
90     EXPECT_EQ(result, NFA_STATUS_OK);
91     EXPECT_EQ(mock_msg.hdr.event, NFA_DM_API_DEREG_NDEF_HDLR_EVT);
92     EXPECT_EQ(mock_msg.ndef_type_handle, ndef_type_handle);
93 }
94 
TEST_F(NFADeactivateTest,Deregistration_LargeHandle)95 TEST_F(NFADeactivateTest, Deregistration_LargeHandle) {
96     tNFA_HANDLE ndef_type_handle = 0xFFFF;
97     tNFA_DM_API_DEREG_NDEF_HDLR mock_msg = {};
98     mock_msg.hdr.event = NFA_DM_API_DEREG_NDEF_HDLR_EVT;
99     mock_msg.ndef_type_handle = ndef_type_handle;
100     tNFA_STATUS result = NFA_DeregisterNDefTypeHandler(ndef_type_handle);
101     EXPECT_EQ(result, NFA_STATUS_OK);
102     EXPECT_EQ(mock_msg.hdr.event, NFA_DM_API_DEREG_NDEF_HDLR_EVT);
103     EXPECT_EQ(mock_msg.ndef_type_handle, ndef_type_handle);
104 }
105 
106 class NFA_DisableDtamodeTest : public testing::Test {
107 protected:
SetUp()108     void SetUp() override {
109         appl_dta_mode_flag = 0xFF;
110         nfa_dm_cb.eDtaMode = 0x00;
111     }
TearDown()112     void TearDown() override {
113     }
114 };
115 
TEST_F(NFA_DisableDtamodeTest,DisablesDtaModeFlag)116 TEST_F(NFA_DisableDtamodeTest, DisablesDtaModeFlag) {
117     NFA_DisableDtamode();
118     EXPECT_EQ(appl_dta_mode_flag, 0x0);
119 }
120 
TEST_F(NFA_DisableDtamodeTest,DisablesDtaModeInCb)121 TEST_F(NFA_DisableDtamodeTest, DisablesDtaModeInCb) {
122     NFA_DisableDtamode();
123     EXPECT_EQ(nfa_dm_cb.eDtaMode, NFA_DTA_APPL_MODE);
124 }
125 
TEST_F(NFA_DisableDtamodeTest,UpdatesBothFlagAndMode)126 TEST_F(NFA_DisableDtamodeTest, UpdatesBothFlagAndMode) {
127     appl_dta_mode_flag = 0xAA;
128     nfa_dm_cb.eDtaMode = 0xFF;
129     NFA_DisableDtamode();
130     EXPECT_EQ(appl_dta_mode_flag, 0x0);
131     EXPECT_EQ(nfa_dm_cb.eDtaMode, NFA_DTA_APPL_MODE);
132 }
133 
TEST_F(NFA_DisableDtamodeTest,NoChangeIfFlagIsAlreadyZero)134 TEST_F(NFA_DisableDtamodeTest, NoChangeIfFlagIsAlreadyZero) {
135     appl_dta_mode_flag = 0x0;
136     uint8_t previous_mode = nfa_dm_cb.eDtaMode;
137     NFA_DisableDtamode();
138     EXPECT_EQ(appl_dta_mode_flag, 0x0);
139     EXPECT_EQ(previous_mode, nfa_dm_cb.eDtaMode);
140 }
141 
142 class NFA_EnableDtamodeTest : public testing::Test {
143 protected:
SetUp()144     void SetUp() override {
145         appl_dta_mode_flag = 0x0;
146     }
TearDown()147     void TearDown() override {
148     }
149 };
150 
TEST_F(NFA_EnableDtamodeTest,SetToApplMode)151 TEST_F(NFA_EnableDtamodeTest, SetToApplMode) {
152     NFA_EnableDtamode(NFA_DTA_APPL_MODE);
153     EXPECT_EQ(nfa_dm_cb.eDtaMode, NFA_DTA_APPL_MODE);
154     EXPECT_EQ(appl_dta_mode_flag, 0x01);
155 }
156 
TEST_F(NFA_EnableDtamodeTest,SetToDefaultMode)157 TEST_F(NFA_EnableDtamodeTest, SetToDefaultMode) {
158     NFA_EnableDtamode(NFA_DTA_DEFAULT_MODE);
159     EXPECT_EQ(nfa_dm_cb.eDtaMode, NFA_DTA_DEFAULT_MODE);
160     EXPECT_EQ(appl_dta_mode_flag, 0x01);
161 }
162 
TEST_F(NFA_EnableDtamodeTest,SetToLlcpMode)163 TEST_F(NFA_EnableDtamodeTest, SetToLlcpMode) {
164     NFA_EnableDtamode(NFA_DTA_LLCP_MODE);
165     EXPECT_EQ(nfa_dm_cb.eDtaMode, NFA_DTA_LLCP_MODE);
166     EXPECT_EQ(appl_dta_mode_flag, 0x01);
167 }
168 
TEST_F(NFA_EnableDtamodeTest,SetToHcefMode)169 TEST_F(NFA_EnableDtamodeTest, SetToHcefMode) {
170     NFA_EnableDtamode(NFA_DTA_HCEF_MODE);
171     EXPECT_EQ(nfa_dm_cb.eDtaMode, NFA_DTA_HCEF_MODE);
172     EXPECT_EQ(appl_dta_mode_flag, 0x01);
173 }
174 
TEST_F(NFA_EnableDtamodeTest,SetToCr8Mode)175 TEST_F(NFA_EnableDtamodeTest, SetToCr8Mode) {
176     NFA_EnableDtamode(NFA_DTA_CR8);
177     EXPECT_EQ(nfa_dm_cb.eDtaMode, NFA_DTA_CR8);
178     EXPECT_EQ(appl_dta_mode_flag, 0x01);
179 }
180 
TEST_F(NFA_EnableDtamodeTest,MultipleModeChanges)181 TEST_F(NFA_EnableDtamodeTest, MultipleModeChanges) {
182     NFA_EnableDtamode(NFA_DTA_APPL_MODE);
183     EXPECT_EQ(nfa_dm_cb.eDtaMode, NFA_DTA_APPL_MODE);
184     NFA_EnableDtamode(NFA_DTA_LLCP_MODE);
185     EXPECT_EQ(nfa_dm_cb.eDtaMode, NFA_DTA_LLCP_MODE);
186 }
187 
TEST_F(NFA_EnableDtamodeTest,SameModeTwice)188 TEST_F(NFA_EnableDtamodeTest, SameModeTwice) {
189     NFA_EnableDtamode(NFA_DTA_HCEF_MODE);
190     EXPECT_EQ(nfa_dm_cb.eDtaMode, NFA_DTA_HCEF_MODE);
191     NFA_EnableDtamode(NFA_DTA_HCEF_MODE);
192     EXPECT_EQ(nfa_dm_cb.eDtaMode, NFA_DTA_HCEF_MODE);
193 }
194 
195 class NFA_PowerOffSleepMode_Test : public ::testing::Test {
196 protected:
SetUp()197     void SetUp() override {
198         nfa_dm_cb.flags = 0;
199     }
TearDown()200     void TearDown() override {
201     }
202 };
203 
TEST_F(NFA_PowerOffSleepMode_Test,EnteringPowerOffSleepMode)204 TEST_F(NFA_PowerOffSleepMode_Test, EnteringPowerOffSleepMode) {
205     tNFA_STATUS result = NFA_PowerOffSleepMode(true);
206     EXPECT_EQ(result, NFA_STATUS_OK);
207     EXPECT_EQ(nfa_dm_cb.flags & NFA_DM_FLAGS_SETTING_PWR_MODE, NFA_DM_FLAGS_SETTING_PWR_MODE);
208 }
209 
TEST_F(NFA_PowerOffSleepMode_Test,LeavingPowerOffSleepMode)210 TEST_F(NFA_PowerOffSleepMode_Test, LeavingPowerOffSleepMode) {
211     tNFA_STATUS result = NFA_PowerOffSleepMode(false);
212     EXPECT_EQ(result, NFA_STATUS_OK);
213     EXPECT_EQ(nfa_dm_cb.flags & NFA_DM_FLAGS_SETTING_PWR_MODE, NFA_DM_FLAGS_SETTING_PWR_MODE);
214 }
215 
TEST_F(NFA_PowerOffSleepMode_Test,FailureDueToBufferAllocationFailure)216 TEST_F(NFA_PowerOffSleepMode_Test, FailureDueToBufferAllocationFailure) {
217     tNFA_STATUS result = NFA_PowerOffSleepMode(true);
218     EXPECT_EQ(result, NFA_STATUS_FAILED);
219 }
220 
mock_callback(unsigned char,tNFA_NDEF_EVT_DATA * p_data)221 void mock_callback(unsigned char, tNFA_NDEF_EVT_DATA* p_data) {
222     (void)p_data;
223 }
224 class NfaRegisterNDefUriHandlerTest : public ::testing::Test {
225 protected:
SetUp()226     void SetUp() override {
227     }
TearDown()228     void TearDown() override {
229     }
230 };
231 
TEST_F(NfaRegisterNDefUriHandlerTest,ValidParameters)232 TEST_F(NfaRegisterNDefUriHandlerTest, ValidParameters) {
233   uint8_t uri[] = { 'U' };
234   uint8_t uri_len = sizeof(uri);
235   tNFA_DM_API_REG_NDEF_HDLR expected_msg = {};
236   expected_msg.flags = NFA_NDEF_FLAGS_WKT_URI;
237   expected_msg.tnf = NFA_TNF_WKT;
238   expected_msg.uri_id = NFA_NDEF_URI_ID_ABSOLUTE;
239   expected_msg.name_len = uri_len;
240   memcpy(expected_msg.name, uri, uri_len);
241   expected_msg.p_ndef_cback = &mock_callback;
242   EXPECT_EQ(NFA_RegisterNDefUriHandler(true, NFA_NDEF_URI_ID_ABSOLUTE, uri,
243                                        uri_len, mock_callback),
244             NFA_STATUS_OK);
245 }
246 
TEST_F(NfaRegisterNDefUriHandlerTest,NullCallback)247 TEST_F(NfaRegisterNDefUriHandlerTest, NullCallback) {
248     EXPECT_EQ(NFA_RegisterNDefUriHandler(
249             true, NFA_NDEF_URI_ID_ABSOLUTE,
250             nullptr, 0, nullptr), NFA_STATUS_INVALID_PARAM);
251 }
252 
TEST_F(NfaRegisterNDefUriHandlerTest,MemoryAllocationFailure)253 TEST_F(NfaRegisterNDefUriHandlerTest, MemoryAllocationFailure) {
254     uint8_t uri[] = "http://example.com";
255     uint8_t uri_len = sizeof(uri) - 1;
256     EXPECT_EQ(NFA_RegisterNDefUriHandler(
257             true, NFA_NDEF_URI_ID_ABSOLUTE,
258             uri, uri_len, mock_callback), NFA_STATUS_FAILED);
259 }
260 
TEST_F(NfaRegisterNDefUriHandlerTest,InvalidUriId)261 TEST_F(NfaRegisterNDefUriHandlerTest, InvalidUriId) {
262   uint8_t uri[] = { 'U' };
263   uint8_t uri_len = sizeof(uri);
264   tNFA_DM_API_REG_NDEF_HDLR expected_msg = {};
265   expected_msg.flags = NFA_NDEF_FLAGS_WKT_URI;
266   expected_msg.tnf = NFA_TNF_WKT;
267   expected_msg.uri_id = NFA_NDEF_URI_ID_HTTP;
268   expected_msg.name_len = 0;
269   expected_msg.p_ndef_cback = &mock_callback;
270   EXPECT_EQ(NFA_RegisterNDefUriHandler(true, NFA_NDEF_URI_ID_HTTP, uri, uri_len,
271                                        &mock_callback),
272             NFA_STATUS_OK);
273 }
274 
275 class NfaReleaseExclusiveRfControlTest : public testing::Test {
276 protected:
SetUp()277     void SetUp() override {
278         nfa_dm_cb.p_excl_conn_cback = nullptr;
279     }
TearDown()280     void TearDown() override {
281     }
282 };
TEST_F(NfaReleaseExclusiveRfControlTest,Test_MemoryAllocationFailure)283 TEST_F(NfaReleaseExclusiveRfControlTest, Test_MemoryAllocationFailure) {
284     nfa_dm_cb.p_excl_conn_cback = reinterpret_cast<tNFA_CONN_CBACK*>(0x1234);
285     EXPECT_EQ(NFA_ReleaseExclusiveRfControl(), NFA_STATUS_FAILED);
286 }
287 
TEST_F(NfaReleaseExclusiveRfControlTest,Test_Success)288 TEST_F(NfaReleaseExclusiveRfControlTest, Test_Success) {
289     nfa_dm_cb.p_excl_conn_cback = reinterpret_cast<tNFA_CONN_CBACK*>(0x1234);
290     NFC_HDR mock_msg;
291     EXPECT_EQ(NFA_ReleaseExclusiveRfControl(), NFA_STATUS_OK);
292 }
293 
TEST_F(NfaReleaseExclusiveRfControlTest,Test_ValidCallback)294 TEST_F(NfaReleaseExclusiveRfControlTest, Test_ValidCallback) {
295     nfa_dm_cb.p_excl_conn_cback = reinterpret_cast<tNFA_CONN_CBACK*>(0x1234);
296     NFC_HDR mock_msg;
297     EXPECT_EQ(NFA_ReleaseExclusiveRfControl(), NFA_STATUS_OK);
298 }
299 
300 class NfaSelectTest : public testing::Test {
301 protected:
SetUp()302     void SetUp() override {
303     }
304 };
305 
TEST_F(NfaSelectTest,TestSuccessfulSelection)306 TEST_F(NfaSelectTest, TestSuccessfulSelection) {
307     uint8_t rf_disc_id = 0x01;
308     tNFA_NFC_PROTOCOL protocol = NFA_PROTOCOL_ISO_DEP;
309     tNFA_INTF_TYPE rf_interface = NFA_INTERFACE_ISO_DEP;
310     NFC_HDR mock_msg;
311     EXPECT_EQ(NFA_Select(rf_disc_id, protocol, rf_interface), NFA_STATUS_OK);
312 }
313 
TEST_F(NfaSelectTest,TestInvalidProtocolForIsoDepInterface)314 TEST_F(NfaSelectTest, TestInvalidProtocolForIsoDepInterface) {
315     uint8_t rf_disc_id = 0x01;
316     tNFA_NFC_PROTOCOL protocol = static_cast<tNFA_NFC_PROTOCOL>(0);
317     tNFA_INTF_TYPE rf_interface = NFA_INTERFACE_ISO_DEP;
318     EXPECT_EQ(NFA_Select(rf_disc_id, protocol, rf_interface), NFA_STATUS_INVALID_PARAM);
319 }
320 
TEST_F(NfaSelectTest,TestMemoryAllocationFailure)321 TEST_F(NfaSelectTest, TestMemoryAllocationFailure) {
322     uint8_t rf_disc_id = 0x01;
323     tNFA_NFC_PROTOCOL protocol = NFA_PROTOCOL_ISO_DEP;
324     tNFA_INTF_TYPE rf_interface = NFA_INTERFACE_ISO_DEP;
325     EXPECT_EQ(NFA_Select(rf_disc_id, protocol, rf_interface), NFA_STATUS_FAILED);
326 }
327 
328 class NfaSendRawFrameTest : public testing::Test {
329 protected:
SetUp()330     void SetUp() override {
331     }
332 };
333 
TEST_F(NfaSendRawFrameTest,TestValidData)334 TEST_F(NfaSendRawFrameTest, TestValidData) {
335     uint8_t raw_data[] = {0x01, 0x02, 0x03};
336     uint16_t data_len = sizeof(raw_data);
337     uint16_t presence_check_start_delay = 10;
338     tNFA_STATUS result = NFA_SendRawFrame(raw_data, data_len, presence_check_start_delay);
339     EXPECT_EQ(result, NFA_STATUS_OK);
340 }
341 
TEST_F(NfaSendRawFrameTest,TestNullDataPointer)342 TEST_F(NfaSendRawFrameTest, TestNullDataPointer) {
343     uint8_t* raw_data = nullptr;
344     uint16_t data_len = 5;
345     uint16_t presence_check_start_delay = 10;
346     tNFA_STATUS result = NFA_SendRawFrame(raw_data, data_len, presence_check_start_delay);
347     EXPECT_EQ(result, NFA_STATUS_OK);
348 }
349 
TEST_F(NfaSendRawFrameTest,TestZeroLengthData)350 TEST_F(NfaSendRawFrameTest, TestZeroLengthData) {
351     uint8_t* raw_data = nullptr;
352     uint16_t data_len = 0;
353     uint16_t presence_check_start_delay = 10;
354     tNFA_STATUS result = NFA_SendRawFrame(raw_data, data_len, presence_check_start_delay);
355     EXPECT_EQ(result, NFA_STATUS_OK);
356 }
357 
TEST_F(NfaSendRawFrameTest,TestMemoryAllocationFailure)358 TEST_F(NfaSendRawFrameTest, TestMemoryAllocationFailure) {
359     uint8_t raw_data[] = {0x01, 0x02, 0x03};
360     uint16_t data_len = sizeof(raw_data);
361     uint16_t presence_check_start_delay = 10;
362     tNFA_STATUS result = NFA_SendRawFrame(raw_data, data_len, presence_check_start_delay);
363     EXPECT_EQ(result, NFA_STATUS_FAILED);
364 }
365 
366 class NfaSetNfccModeTest : public testing::Test {
367 protected:
SetUp()368     void SetUp() override {
369         nfc_cb.nfcc_mode = 0;
370     }
371 };
372 
TEST_F(NfaSetNfccModeTest,TestSetModeToDefault)373 TEST_F(NfaSetNfccModeTest, TestSetModeToDefault) {
374     uint8_t mode = ENABLE_MODE_DEFAULT;
375     nfc_cb.nfcc_mode = ENABLE_MODE_TRANSPARENT;
376     NFA_SetNfccMode(mode);
377     EXPECT_EQ(nfc_cb.nfcc_mode, mode);
378 }
379 
TEST_F(NfaSetNfccModeTest,TestSetModeToTransparent)380 TEST_F(NfaSetNfccModeTest, TestSetModeToTransparent) {
381     uint8_t mode = ENABLE_MODE_TRANSPARENT;
382     nfc_cb.nfcc_mode = ENABLE_MODE_DEFAULT;
383     NFA_SetNfccMode(mode);
384     EXPECT_EQ(nfc_cb.nfcc_mode, mode);
385 }
386 
TEST_F(NfaSetNfccModeTest,TestSetModeToEE)387 TEST_F(NfaSetNfccModeTest, TestSetModeToEE) {
388     uint8_t mode = ENABLE_MODE_EE;
389     nfc_cb.nfcc_mode = ENABLE_MODE_DEFAULT;
390     NFA_SetNfccMode(mode);
391     EXPECT_EQ(nfc_cb.nfcc_mode, mode);
392 }
393 
TEST_F(NfaSetNfccModeTest,TestRedundantModeChange)394 TEST_F(NfaSetNfccModeTest, TestRedundantModeChange) {
395     uint8_t mode = ENABLE_MODE_TRANSPARENT;
396     nfc_cb.nfcc_mode = mode;
397     NFA_SetNfccMode(mode);
398     EXPECT_EQ(nfc_cb.nfcc_mode, mode);
399 }
400 
401 class MockNfaSVC {
402 public:
403     MOCK_METHOD(void, nfa_sys_sendmsg, (void* p_msg), ());
404 };
405 
406 class NFA_SendVsCommand_Test : public ::testing::Test {
407 protected:
SetUp()408     void SetUp() override {
409         mock_nfa_svc = std::make_unique<MockNfaSVC>();
410     }
TearDown()411     void TearDown() override {
412         testing::Mock::VerifyAndClearExpectations(mock_nfa_svc.get());
413     }
414     std::unique_ptr<MockNfaSVC> mock_nfa_svc;
415 };
416 
TEST_F(NFA_SendVsCommand_Test,TestValidCommand)417 TEST_F(NFA_SendVsCommand_Test, TestValidCommand) {
418     uint8_t oid = 0x01;
419     uint8_t cmd_params_len = 4;
420     uint8_t cmd_params[] = {0x11, 0x22, 0x33, 0x44};
421     tNFA_VSC_CBACK* p_cback = nullptr;
422     EXPECT_CALL(*mock_nfa_svc, nfa_sys_sendmsg(testing::_)).Times(0);
423     tNFA_STATUS result = NFA_SendVsCommand(oid, cmd_params_len, cmd_params, p_cback);
424     EXPECT_EQ(result, NFA_STATUS_OK);
425 }
426 
TEST_F(NFA_SendVsCommand_Test,TestValidCommandWithNullParams)427 TEST_F(NFA_SendVsCommand_Test, TestValidCommandWithNullParams) {
428     uint8_t oid = 0x02;
429     uint8_t cmd_params_len = 0;
430     uint8_t* cmd_params = nullptr;
431     tNFA_VSC_CBACK* p_cback = nullptr;
432     EXPECT_CALL(*mock_nfa_svc, nfa_sys_sendmsg(testing::_)).Times(0);
433     tNFA_STATUS result = NFA_SendVsCommand(oid, cmd_params_len, cmd_params, p_cback);
434     EXPECT_EQ(result, NFA_STATUS_OK);
435 }
436 
TEST_F(NFA_SendVsCommand_Test,TestNullCmdParamsWithZeroLength)437 TEST_F(NFA_SendVsCommand_Test, TestNullCmdParamsWithZeroLength) {
438     uint8_t oid = 0x03;
439     uint8_t cmd_params_len = 0;
440     uint8_t* cmd_params = nullptr;
441     tNFA_VSC_CBACK* p_cback = nullptr;
442     EXPECT_CALL(*mock_nfa_svc, nfa_sys_sendmsg(testing::_)).Times(0);
443     tNFA_STATUS result = NFA_SendVsCommand(oid, cmd_params_len, cmd_params, p_cback);
444     EXPECT_EQ(result, NFA_STATUS_OK);
445 }
446 
TEST_F(NFA_SendVsCommand_Test,TestInvalidCmdParamsLength)447 TEST_F(NFA_SendVsCommand_Test, TestInvalidCmdParamsLength) {
448     uint8_t oid = 0x04;
449     uint8_t cmd_params_len = 255;
450     uint8_t cmd_params[255] = {};
451     tNFA_VSC_CBACK* p_cback = nullptr;
452     EXPECT_CALL(*mock_nfa_svc, nfa_sys_sendmsg(testing::_)).Times(0);
453     tNFA_STATUS result = NFA_SendVsCommand(oid, cmd_params_len, cmd_params, p_cback);
454     EXPECT_EQ(result, NFA_STATUS_OK);
455 }
456 
TEST_F(NFA_SendVsCommand_Test,TestMemoryAllocationFailure)457 TEST_F(NFA_SendVsCommand_Test, TestMemoryAllocationFailure) {
458     uint8_t oid = 0x05;
459     uint8_t cmd_params_len = 4;
460     uint8_t cmd_params[] = {0x01, 0x02, 0x03, 0x04};
461     tNFA_VSC_CBACK* p_cback = nullptr;
462     EXPECT_CALL(*mock_nfa_svc, nfa_sys_sendmsg(testing::_)).Times(0);
463     tNFA_STATUS result = NFA_SendVsCommand(oid, cmd_params_len, cmd_params, p_cback);
464     EXPECT_EQ(result, NFA_STATUS_FAILED);
465 }
466 
TEST_F(NFA_SendVsCommand_Test,TestInvalidOID)467 TEST_F(NFA_SendVsCommand_Test, TestInvalidOID) {
468     uint8_t oid = 0xFF;
469     uint8_t cmd_params_len = 3;
470     uint8_t cmd_params[] = {0x01, 0x02, 0x03};
471     tNFA_VSC_CBACK* p_cback = nullptr;
472     EXPECT_CALL(*mock_nfa_svc, nfa_sys_sendmsg(testing::_)).Times(0);
473     tNFA_STATUS result = NFA_SendVsCommand(oid, cmd_params_len, cmd_params, p_cback);
474     EXPECT_EQ(result, NFA_STATUS_OK);
475 }
476 
TEST_F(NFA_SendVsCommand_Test,TestNullCallback)477 TEST_F(NFA_SendVsCommand_Test, TestNullCallback) {
478     uint8_t oid = 0x06;
479     uint8_t cmd_params_len = 4;
480     uint8_t cmd_params[] = {0x11, 0x22, 0x33, 0x44};
481     tNFA_VSC_CBACK* p_cback = nullptr;
482     EXPECT_CALL(*mock_nfa_svc, nfa_sys_sendmsg(testing::_)).Times(0);
483     tNFA_STATUS result = NFA_SendVsCommand(oid, cmd_params_len, cmd_params, p_cback);
484     EXPECT_EQ(result, NFA_STATUS_OK);
485 }
486 
487 #define INVALID_RF_TECH_MODE 0xFF
488 #define INVALID_BIT_RATE     0xFF
489 class MockNfaUpdate {
490 public:
491     MOCK_METHOD(void, nfa_sys_sendmsg, (void* p_msg), ());
492 };
493 
494 class NFA_UpdateRFCommParams_Test : public ::testing::Test {
495 protected:
496     std::unique_ptr<MockNfaUpdate> mock_nfa_update;
SetUp()497     void SetUp() override {
498         mock_nfa_update = std::make_unique<MockNfaUpdate>();
499     }
TearDown()500     void TearDown() override {
501         testing::Mock::VerifyAndClearExpectations(mock_nfa_update.get());
502     }
503 };
504 
TEST_F(NFA_UpdateRFCommParams_Test,TestDefaultValidParams)505 TEST_F(NFA_UpdateRFCommParams_Test, TestDefaultValidParams) {
506     tNFC_RF_COMM_PARAMS rf_params = {
507             .include_rf_tech_mode = true,
508             .rf_tech_n_mode = NCI_DISCOVERY_TYPE_POLL_A,
509             .include_tx_bit_rate = true,
510             .tx_bit_rate = NCI_BIT_RATE_212 ,
511             .include_rx_bit_rate = true,
512             .rx_bit_rate = NCI_BIT_RATE_212 ,
513             .include_nfc_b_config = false,
514             .min_tr0 = 10,
515             .min_tr1 = 20,
516             .suppression_eos = 0,
517             .suppression_sos = 0,
518             .min_tr2 = 30
519     };
520     EXPECT_CALL(*mock_nfa_update, nfa_sys_sendmsg(testing::_)).Times(0);
521     tNFA_STATUS result = NFA_UpdateRFCommParams(&rf_params);
522     EXPECT_EQ(result, NFA_STATUS_OK);
523 }
524 
TEST_F(NFA_UpdateRFCommParams_Test,TestAllFlagsTrue)525 TEST_F(NFA_UpdateRFCommParams_Test, TestAllFlagsTrue) {
526     tNFC_RF_COMM_PARAMS rf_params = {
527             .include_rf_tech_mode = true,
528             .rf_tech_n_mode = NCI_DISCOVERY_TYPE_POLL_B_PRIME,
529             .include_tx_bit_rate = true,
530             .tx_bit_rate = NCI_BIT_RATE_424,
531             .include_rx_bit_rate = true,
532             .rx_bit_rate = NCI_BIT_RATE_424,
533             .include_nfc_b_config = true,
534             .min_tr0 = 15,
535             .min_tr1 = 25,
536             .suppression_eos = 1,
537             .suppression_sos = 1,
538             .min_tr2 = 35
539     };
540     EXPECT_CALL(*mock_nfa_update, nfa_sys_sendmsg(testing::_)).Times(0);
541     tNFA_STATUS result = NFA_UpdateRFCommParams(&rf_params);
542     EXPECT_EQ(result, NFA_STATUS_OK);
543 }
544 
TEST_F(NFA_UpdateRFCommParams_Test,TestMissingOptionalParams)545 TEST_F(NFA_UpdateRFCommParams_Test, TestMissingOptionalParams) {
546     tNFC_RF_COMM_PARAMS rf_params = {
547             .include_rf_tech_mode = false,
548             .rf_tech_n_mode = NCI_DISCOVERY_TYPE_POLL_A,
549             .include_tx_bit_rate = false,
550             .tx_bit_rate = NCI_BIT_RATE_212,
551             .include_rx_bit_rate = false,
552             .rx_bit_rate = NCI_BIT_RATE_212,
553             .include_nfc_b_config = false,
554             .min_tr0 = 10,
555             .min_tr1 = 20,
556             .suppression_eos = 0,
557             .suppression_sos = 0,
558             .min_tr2 = 30
559     };
560     EXPECT_CALL(*mock_nfa_update, nfa_sys_sendmsg(testing::_)).Times(0);
561     tNFA_STATUS result = NFA_UpdateRFCommParams(&rf_params);
562     EXPECT_EQ(result, NFA_STATUS_OK);
563 }
564 
TEST_F(NFA_UpdateRFCommParams_Test,TestInvalidRfTechMode)565 TEST_F(NFA_UpdateRFCommParams_Test, TestInvalidRfTechMode) {
566     tNFC_RF_COMM_PARAMS rf_params = {
567             .include_rf_tech_mode = true,
568             .rf_tech_n_mode = INVALID_RF_TECH_MODE,
569             .include_tx_bit_rate = true,
570             .tx_bit_rate = NCI_BIT_RATE_212,
571             .include_rx_bit_rate = true,
572             .rx_bit_rate = NCI_BIT_RATE_212,
573             .include_nfc_b_config = false,
574             .min_tr0 = 10,
575             .min_tr1 = 20,
576             .suppression_eos = 0,
577             .suppression_sos = 0,
578             .min_tr2 = 30
579     };
580     EXPECT_CALL(*mock_nfa_update, nfa_sys_sendmsg(testing::_)).Times(0);
581     tNFA_STATUS result = NFA_UpdateRFCommParams(&rf_params);
582     EXPECT_EQ(result, NFA_STATUS_FAILED);
583 }
584 
TEST_F(NFA_UpdateRFCommParams_Test,TestInvalidBitRate)585 TEST_F(NFA_UpdateRFCommParams_Test, TestInvalidBitRate) {
586     tNFC_RF_COMM_PARAMS rf_params = {
587             .include_rf_tech_mode = true,
588             .rf_tech_n_mode = NCI_DISCOVERY_TYPE_POLL_A,
589             .include_tx_bit_rate = true,
590             .tx_bit_rate = INVALID_BIT_RATE,
591             .include_rx_bit_rate = true,
592             .rx_bit_rate = INVALID_BIT_RATE,
593             .include_nfc_b_config = false,
594             .min_tr0 = 10,
595             .min_tr1 = 20,
596             .suppression_eos = 0,
597             .suppression_sos = 0,
598             .min_tr2 = 30
599     };
600     EXPECT_CALL(*mock_nfa_update, nfa_sys_sendmsg(testing::_)).Times(0);
601     tNFA_STATUS result = NFA_UpdateRFCommParams(&rf_params);
602     EXPECT_EQ(result, NFA_STATUS_FAILED);
603 }
604