Files
logos-liblogos/tests/test_process_stats.cpp

171 lines
5.3 KiB
C++
Raw Permalink Normal View History

2026-01-22 15:51:03 -05:00
#include <gtest/gtest.h>
2026-03-24 16:50:23 -04:00
#include <process_stats/process_stats.h>
2026-01-22 15:51:03 -05:00
#include <QCoreApplication>
2026-03-24 16:50:23 -04:00
#include <QProcess>
#include <nlohmann/json.hpp>
2026-01-22 15:51:03 -05:00
#include <cstring>
#include <unistd.h>
class ProcessStatsTest : public ::testing::Test {
protected:
2026-03-24 16:50:23 -04:00
QList<QProcess*> m_processes;
2026-01-22 15:51:03 -05:00
void SetUp() override {
2026-03-24 16:50:23 -04:00
ProcessStats::clearHistory();
2026-01-22 15:51:03 -05:00
}
2026-03-24 16:50:23 -04:00
2026-01-22 15:51:03 -05:00
void TearDown() override {
2026-03-24 16:50:23 -04:00
ProcessStats::clearHistory();
for (QProcess* process : m_processes) {
2026-01-22 15:51:03 -05:00
if (process) {
process->terminate();
process->waitForFinished(1000);
delete process;
}
}
2026-03-24 16:50:23 -04:00
m_processes.clear();
2026-01-22 15:51:03 -05:00
}
};
// =============================================================================
// getProcessStats Tests
// =============================================================================
// Verifies that getProcessStats() returns zeroed stats for negative PID
TEST_F(ProcessStatsTest, GetProcessStats_ReturnsZeroedStatsForNegativePid) {
2026-03-24 16:50:23 -04:00
ProcessStats::ProcessStatsData stats = ProcessStats::getProcessStats(-1);
2026-01-22 15:51:03 -05:00
EXPECT_EQ(stats.cpuPercent, 0.0);
EXPECT_EQ(stats.cpuTimeSeconds, 0.0);
EXPECT_EQ(stats.memoryMB, 0.0);
}
// Verifies that getProcessStats() returns zeroed stats for zero PID
TEST_F(ProcessStatsTest, GetProcessStats_ReturnsZeroedStatsForZeroPid) {
2026-03-24 16:50:23 -04:00
ProcessStats::ProcessStatsData stats = ProcessStats::getProcessStats(0);
2026-01-22 15:51:03 -05:00
EXPECT_EQ(stats.cpuPercent, 0.0);
EXPECT_EQ(stats.cpuTimeSeconds, 0.0);
EXPECT_EQ(stats.memoryMB, 0.0);
}
// Verifies that getProcessStats() returns valid stats for the current process
TEST_F(ProcessStatsTest, GetProcessStats_ReturnsValidStatsForCurrentProcess) {
qint64 currentPid = getpid();
2026-03-24 16:50:23 -04:00
ProcessStats::ProcessStatsData stats = ProcessStats::getProcessStats(currentPid);
2026-01-22 15:51:03 -05:00
EXPECT_GT(stats.memoryMB, 0.0);
EXPECT_GE(stats.cpuTimeSeconds, 0.0);
}
// Verifies that memory usage is non-negative for a valid process
TEST_F(ProcessStatsTest, GetProcessStats_MemoryIsNonNegative) {
qint64 currentPid = getpid();
2026-03-24 16:50:23 -04:00
ProcessStats::ProcessStatsData stats = ProcessStats::getProcessStats(currentPid);
2026-01-22 15:51:03 -05:00
EXPECT_GE(stats.memoryMB, 0.0);
}
// Verifies that CPU time is non-negative for a valid process
TEST_F(ProcessStatsTest, GetProcessStats_CpuTimeIsNonNegative) {
qint64 currentPid = getpid();
2026-03-24 16:50:23 -04:00
ProcessStats::ProcessStatsData stats = ProcessStats::getProcessStats(currentPid);
2026-01-22 15:51:03 -05:00
EXPECT_GE(stats.cpuTimeSeconds, 0.0);
}
// Verifies that CPU percent is zero on first call (no previous data)
TEST_F(ProcessStatsTest, GetProcessStats_CpuPercentIsZeroOnFirstCall) {
qint64 currentPid = getpid();
2026-03-24 16:50:23 -04:00
ProcessStats::ProcessStatsData stats = ProcessStats::getProcessStats(currentPid);
2026-01-22 15:51:03 -05:00
EXPECT_EQ(stats.cpuPercent, 0.0);
}
// Verifies that CPU percent is calculated after the initial call
TEST_F(ProcessStatsTest, GetProcessStats_CpuPercentUpdatesOnSecondCall) {
qint64 currentPid = getpid();
2026-03-24 16:50:23 -04:00
2026-01-22 15:51:03 -05:00
ProcessStats::getProcessStats(currentPid);
2026-03-24 16:50:23 -04:00
2026-01-22 15:51:03 -05:00
volatile double sum = 0.0;
for (int i = 0; i < 1000000; ++i) {
sum += i * 0.1;
}
2026-03-24 16:50:23 -04:00
2026-01-22 15:51:03 -05:00
usleep(10000); // 10ms
2026-03-24 16:50:23 -04:00
ProcessStats::ProcessStatsData stats = ProcessStats::getProcessStats(currentPid);
2026-01-22 15:51:03 -05:00
EXPECT_GE(stats.cpuPercent, 0.0);
}
// =============================================================================
// getModuleStats Tests
// =============================================================================
// Verifies that getModuleStats() returns an empty JSON array when no plugins are loaded
TEST_F(ProcessStatsTest, GetModuleStats_ReturnsEmptyArrayWhenNoPlugins) {
2026-03-24 16:50:23 -04:00
QHash<QString, qint64> processes;
char* result = ProcessStats::getModuleStats(processes);
2026-01-22 15:51:03 -05:00
ASSERT_NE(result, nullptr);
2026-03-24 16:50:23 -04:00
nlohmann::json doc = nlohmann::json::parse(result);
2026-03-24 16:50:23 -04:00
EXPECT_TRUE(doc.is_array());
EXPECT_EQ(doc.size(), 0);
2026-03-24 16:50:23 -04:00
2026-01-22 15:51:03 -05:00
delete[] result;
}
// Verifies that getModuleStats() returns a non-null pointer
TEST_F(ProcessStatsTest, GetModuleStats_ReturnsNonNullPointer) {
2026-03-24 16:50:23 -04:00
QHash<QString, qint64> processes;
char* result = ProcessStats::getModuleStats(processes);
2026-01-22 15:51:03 -05:00
ASSERT_NE(result, nullptr);
2026-03-24 16:50:23 -04:00
2026-01-22 15:51:03 -05:00
delete[] result;
}
// Verifies that getModuleStats() returns valid JSON structure with correct fields
TEST_F(ProcessStatsTest, GetModuleStats_ReturnsValidJsonStructure) {
QProcess* dummyProcess = new QProcess();
2026-03-24 16:50:23 -04:00
m_processes.append(dummyProcess);
2026-01-22 15:51:03 -05:00
dummyProcess->start("sleep", QStringList() << "1");
dummyProcess->waitForStarted();
2026-03-24 16:50:23 -04:00
2026-01-22 15:51:03 -05:00
qint64 pid = dummyProcess->processId();
ASSERT_GT(pid, 0);
2026-03-24 16:50:23 -04:00
QHash<QString, qint64> processes;
processes.insert("test_plugin", pid);
char* result = ProcessStats::getModuleStats(processes);
2026-01-22 15:51:03 -05:00
ASSERT_NE(result, nullptr);
2026-03-24 16:50:23 -04:00
nlohmann::json doc = nlohmann::json::parse(result);
2026-03-24 16:50:23 -04:00
EXPECT_TRUE(doc.is_array());
ASSERT_EQ(doc.size(), 1);
2026-03-24 16:50:23 -04:00
auto moduleObj = doc[0];
2026-01-22 15:51:03 -05:00
EXPECT_TRUE(moduleObj.contains("name"));
EXPECT_TRUE(moduleObj.contains("cpu_percent"));
EXPECT_TRUE(moduleObj.contains("cpu_time_seconds"));
EXPECT_TRUE(moduleObj.contains("memory_mb"));
2026-03-24 16:50:23 -04:00
EXPECT_EQ(moduleObj["name"].get<std::string>(), "test_plugin");
EXPECT_GE(moduleObj["cpu_percent"].get<double>(), 0.0);
EXPECT_GE(moduleObj["cpu_time_seconds"].get<double>(), 0.0);
EXPECT_GE(moduleObj["memory_mb"].get<double>(), 0.0);
2026-03-24 16:50:23 -04:00
2026-01-22 15:51:03 -05:00
delete[] result;
}