-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathtest_process_monitor.cpp
More file actions
102 lines (88 loc) · 3.28 KB
/
Copy pathtest_process_monitor.cpp
File metadata and controls
102 lines (88 loc) · 3.28 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
#include <gtest/gtest.h>
#include <algorithm>
#include <vector>
#include "sysmon/process_monitor.hpp"
TEST(ProcessMonitorTest, FindsAtLeastOneProcess) {
ProcessMonitor mon;
auto procs = mon.read(100);
EXPECT_FALSE(procs.empty());
for (const auto& p : procs) {
EXPECT_GT(p.pid, 0);
EXPECT_FALSE(p.name.empty());
}
}
TEST(ProcessMonitorTest, TwoSamplesProduceNoNegativeCpu) {
ProcessMonitor mon;
mon.read(100);
auto second = mon.read(100);
for (const auto& p : second) {
EXPECT_GE(p.cpu_percent, 0.0);
}
}
TEST(ProcessMonitorTest, MemoryPercentWithinRange) {
ProcessMonitor mon;
auto procs = mon.read(100);
for (const auto& p : procs) {
EXPECT_GE(p.mem_percent, 0.0);
EXPECT_LE(p.mem_percent, 100.0);
}
}
// ---------------------------------------------------------------------------
// Sorting
// ---------------------------------------------------------------------------
namespace {
std::vector<ProcessStats> make_process_list() {
std::vector<ProcessStats> procs(3);
procs[0].pid = 30; procs[0].name = "zebra"; procs[0].cpu_percent = 1.0;
procs[0].mem_rss_bytes = 300; procs[0].cpu_time_seconds = 5.0;
procs[1].pid = 10; procs[1].name = "alpha"; procs[1].cpu_percent = 9.0;
procs[1].mem_rss_bytes = 100; procs[1].cpu_time_seconds = 50.0;
procs[2].pid = 20; procs[2].name = "Middle"; procs[2].cpu_percent = 5.0;
procs[2].mem_rss_bytes = 900; procs[2].cpu_time_seconds = 1.0;
return procs;
}
} // namespace
TEST(ProcessMonitorTest, SortsByCpuDescending) {
auto procs = make_process_list();
ProcessMonitor::sort_processes(procs, ProcSort::Cpu);
EXPECT_EQ(procs[0].pid, 10);
EXPECT_EQ(procs[2].pid, 30);
}
TEST(ProcessMonitorTest, SortsByMemoryDescending) {
auto procs = make_process_list();
ProcessMonitor::sort_processes(procs, ProcSort::Memory);
EXPECT_EQ(procs[0].mem_rss_bytes, 900u);
EXPECT_EQ(procs[2].mem_rss_bytes, 100u);
}
TEST(ProcessMonitorTest, SortsByPidAscending) {
auto procs = make_process_list();
ProcessMonitor::sort_processes(procs, ProcSort::Pid);
EXPECT_EQ(procs[0].pid, 10);
EXPECT_EQ(procs[1].pid, 20);
EXPECT_EQ(procs[2].pid, 30);
}
TEST(ProcessMonitorTest, SortsByNameCaseInsensitively) {
auto procs = make_process_list();
ProcessMonitor::sort_processes(procs, ProcSort::Name);
EXPECT_EQ(procs[0].name, "alpha");
EXPECT_EQ(procs[1].name, "Middle");
EXPECT_EQ(procs[2].name, "zebra");
}
TEST(ProcessMonitorTest, SortsByAccumulatedCpuTime) {
auto procs = make_process_list();
ProcessMonitor::sort_processes(procs, ProcSort::Time);
EXPECT_EQ(procs[0].pid, 10);
EXPECT_EQ(procs[2].pid, 20);
}
TEST(ProcessMonitorTest, CpuTimeIsPlausibleForLongLivedProcesses) {
// A macOS regression guard: task times are mach ticks, not nanoseconds, so
// forgetting the timebase conversion understates CPU time by roughly 41x.
// Something on a machine that has been up a while must have accumulated
// more than a second of CPU.
ProcessMonitor monitor;
const auto procs = monitor.read(0, ProcSort::Time);
ASSERT_FALSE(procs.empty());
double max_cpu_time = 0.0;
for (const auto& p : procs) max_cpu_time = std::max(max_cpu_time, p.cpu_time_seconds);
EXPECT_GT(max_cpu_time, 1.0);
}