|
4 | 4 | # Copyright, 2024-2025, by Samuel Williams. |
5 | 5 |
|
6 | 6 | require "process/metrics" |
| 7 | +# On Linux, load ps backend too so we can compare General (Linux) vs General::ProcessStatus in tests. |
| 8 | +require "process/metrics/general/process_status" if RUBY_PLATFORM.include?("linux") |
7 | 9 |
|
8 | 10 | describe Process::Metrics::General do |
9 | 11 | with ".capture" do |
@@ -100,4 +102,56 @@ def after(error = nil) |
100 | 102 | expect(child.process_group_id).to be_a(Integer) |
101 | 103 | end |
102 | 104 | end |
| 105 | + |
| 106 | + with "Linux backend matches ps backend (Linux only)" do |
| 107 | + it "single pid capture matches" do |
| 108 | + skip "Linux with ps required" unless RUBY_PLATFORM.include?("linux") && Process::Metrics::General::ProcessStatus.supported? |
| 109 | + |
| 110 | + pid = Process.pid |
| 111 | + linux = Process::Metrics::General.capture(pid: pid, memory: false) |
| 112 | + ps = Process::Metrics::General::ProcessStatus.capture(pid: pid, memory: false) |
| 113 | + |
| 114 | + expect(linux.keys).to be == ps.keys |
| 115 | + linux.each_key do |p| |
| 116 | + l = linux[p] |
| 117 | + ps_process = ps[p] |
| 118 | + expect(ps_process).not.to be_nil |
| 119 | + expect(l.process_id).to be == ps_process.process_id |
| 120 | + expect(l.parent_process_id).to be == ps_process.parent_process_id |
| 121 | + expect(l.process_group_id).to be == ps_process.process_group_id |
| 122 | + expect(l.virtual_size).to be == ps_process.virtual_size |
| 123 | + expect(l.resident_size).to be == ps_process.resident_size |
| 124 | + expect(l.command).to be == ps_process.command |
| 125 | + expect((l.processor_time - ps_process.processor_time).abs).to be < 1.0 |
| 126 | + expect((l.elapsed_time - ps_process.elapsed_time).abs).to be < 1.0 |
| 127 | + end |
| 128 | + end |
| 129 | + |
| 130 | + it "pid and ppid capture matches" do |
| 131 | + skip "Linux with ps required" unless RUBY_PLATFORM.include?("linux") && Process::Metrics::General::ProcessStatus.supported? |
| 132 | + |
| 133 | + child_pid = Process.spawn("sleep 10") |
| 134 | + begin |
| 135 | + linux = Process::Metrics::General.capture(pid: child_pid, ppid: child_pid, memory: false) |
| 136 | + ps = Process::Metrics::General::ProcessStatus.capture(pid: child_pid, ppid: child_pid, memory: false) |
| 137 | + expect(linux.keys.sort).to be == ps.keys.sort |
| 138 | + linux.each_key do |p| |
| 139 | + l = linux[p] |
| 140 | + ps_process = ps[p] |
| 141 | + expect(ps_process).not.to be_nil |
| 142 | + expect(l.process_id).to be == ps_process.process_id |
| 143 | + expect(l.parent_process_id).to be == ps_process.parent_process_id |
| 144 | + expect(l.process_group_id).to be == ps_process.process_group_id |
| 145 | + expect(l.virtual_size).to be == ps_process.virtual_size |
| 146 | + expect(l.resident_size).to be == ps_process.resident_size |
| 147 | + expect(l.command).to be == ps_process.command |
| 148 | + expect((l.processor_time - ps_process.processor_time).abs).to be < 1.0 |
| 149 | + expect((l.elapsed_time - ps_process.elapsed_time).abs).to be < 1.0 |
| 150 | + end |
| 151 | + ensure |
| 152 | + Process.kill(:TERM, child_pid) |
| 153 | + Process.wait(child_pid) |
| 154 | + end |
| 155 | + end |
| 156 | + end |
103 | 157 | end |
0 commit comments