// // Copyright (C) 2024 The Android Open Source Project // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // #include #include #include #include #include #include "debug_nfcsnoop.h" #define BUFFER_SIZE 3 extern uint8_t* buffers[BUFFER_SIZE]; // Mock for RingBuffer class MockRingBuffer { public: MOCK_METHOD(bool, insert, (const uint8_t* data, size_t length), ()); MOCK_METHOD(bool, pop, (uint8_t* buffer, size_t length), ()); }; struct ringbuffer_t { size_t size; }; void CleanUpTestFile(const std::string& path) { unlink(path.c_str()); } TEST(NfcSnoopTest, DumpWithDataTest) { NFC_HDR mock_hdr; mock_hdr.len = 4; mock_hdr.offset = 0; uint8_t data[] = {0x01, 0x02, 0x03, 0x04}; int fd = open("/tmp/nfc_snoop_test_dump", O_RDWR | O_CREAT | O_TRUNC, 0644); ASSERT_GE(fd, 0); debug_nfcsnoop_dump(fd); struct stat st; int ret = stat("/tmp/nfc_snoop_test_dump", &st); ASSERT_EQ(ret, 0); ASSERT_GT(st.st_size, 0); close(fd); CleanUpTestFile("/tmp/nfc_snoop_test_dump"); } TEST(NfcSnoopTest, DumpEmptyBuffersTest) { int fd = open("/tmp/nfc_snoop_test_dump_empty", O_RDWR | O_CREAT | O_TRUNC, 0644); ASSERT_GE(fd, 0); debug_nfcsnoop_dump(fd); struct stat st; int ret = stat("/tmp/nfc_snoop_test_dump_empty", &st); ASSERT_EQ(ret, 0); ASSERT_EQ(st.st_size, 56); close(fd); CleanUpTestFile("/tmp/nfc_snoop_test_dump_empty"); } // Test for simulating a ringbuffer allocation failure TEST(NfcSnoopTest, DumpRingbufferInitFailureTest) { uint8_t* buffers[BUFFER_SIZE]; ringbuffer_t* ringbuffers[BUFFER_SIZE]; buffers[0] = new uint8_t[256]; buffers[1] = new uint8_t[256]; ringbuffers[0] = new ringbuffer_t; ringbuffers[1] = nullptr; const std::string test_file = "/tmp/nfc_snoop_test_ringbuffer_init_failure"; int fd = open(test_file.c_str(), O_RDWR | O_CREAT | O_TRUNC, 0644); ASSERT_GE(fd, 0) << "Failed to open the test file"; debug_nfcsnoop_dump(fd); close(fd); struct stat st; int ret = stat(test_file.c_str(), &st); ASSERT_EQ(ret, 0) << "File should exist"; char buffer[1024]; fd = open(test_file.c_str(), O_RDONLY); ssize_t bytesRead = read(fd, buffer, sizeof(buffer)); ASSERT_GT(bytesRead, 0) << "Expected content in the file, but it is empty"; buffer[bytesRead] = '\0'; std::cout << "File content:\n" << buffer << std::endl; std::string content(buffer); bool foundReadyMessage = content.find( "Nfcsnoop is not ready (LOG_SUMMARY)") != std::string::npos; bool foundAllocationMessage = content.find( "Unable to allocate memory for compression") != std::string::npos; ASSERT_TRUE(foundReadyMessage || foundAllocationMessage) << "Expected one of the error messages, but neither was found."; if (foundReadyMessage) { std::cout << "Found 'Nfcsnoop is not ready' message. Likely caused by nullptr buffer." << std::endl; } if (foundAllocationMessage) { std::cout << "Found 'Unable to allocate memory for compression' message. " << "Ringbuffer allocation failed." << std::endl; } close(fd); CleanUpTestFile(test_file); delete[] buffers[0]; delete[] buffers[1]; } TEST(NfcSnoopTest, StoreLogsSuccessTest) { const std::string log_data = "Test NFC log data"; bool result = storeNfcSnoopLogs("/tmp/nfc_snoop_log", 1024); ASSERT_TRUE(result); struct stat st; int ret = stat("/tmp/nfc_snoop_log", &st); ASSERT_EQ(ret, 0); ASSERT_GT(st.st_size, 0); CleanUpTestFile("/tmp/nfc_snoop_log"); } TEST(NfcSnoopTest, StoreLogsValidPathTest) { const std::string log_data = "Valid NFC log data"; bool result = storeNfcSnoopLogs("/tmp/nfc_snoop_valid_log", 1024); ASSERT_TRUE(result); struct stat st; int ret = stat("/tmp/nfc_snoop_valid_log", &st); ASSERT_EQ(ret, 0); ASSERT_GT(st.st_size, 0); CleanUpTestFile("/tmp/nfc_snoop_valid_log"); } TEST(NfcSnoopTest, StoreLogsEmptyDataTest) { const std::string log_data = ""; bool result = storeNfcSnoopLogs("/tmp/nfc_snoop_empty_log", 1024); ASSERT_TRUE(result); struct stat st; int ret = stat("/tmp/nfc_snoop_empty_log", &st); ASSERT_EQ(ret, 0); ASSERT_GT(st.st_size, 0); ASSERT_LT(st.st_size, 1024); CleanUpTestFile("/tmp/nfc_snoop_empty_log"); } TEST(NfcSnoopTest, StoreLogsFileCreationFailTest) { const std::string log_data = "Some NFC log data"; bool result = storeNfcSnoopLogs("/root/nfc_snoop_fail_log", 1024); ASSERT_FALSE(result); struct stat st; int ret = stat("/root/nfc_snoop_fail_log", &st); ASSERT_EQ(ret, -1); }