blob: 7d59262667d030ab61eee6d74685c240d49143cb [file] [log] [blame]
//
// 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 <gtest/gtest.h>
#include <gmock/gmock.h>
#include <fcntl.h>
#include <unistd.h>
#include <sys/stat.h>
#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);
}