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