sys-proctable 1.2.6 → 1.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (40) hide show
  1. checksums.yaml +4 -4
  2. checksums.yaml.gz.sig +0 -0
  3. data/{CHANGES.rdoc → CHANGES.md} +69 -49
  4. data/Gemfile +2 -0
  5. data/{MANIFEST.rdoc → MANIFEST.md} +9 -1
  6. data/README.md +9 -3
  7. data/Rakefile +10 -7
  8. data/certs/djberg96_pub.pem +26 -0
  9. data/lib/bsd/sys/dragonfly/sys/proctable/constants.rb +11 -0
  10. data/lib/bsd/sys/dragonfly/sys/proctable/functions.rb +14 -0
  11. data/lib/bsd/sys/dragonfly/sys/proctable/structs.rb +298 -0
  12. data/lib/bsd/sys/dragonfly/sys/proctable.rb +175 -0
  13. data/lib/bsd/sys/freebsd/sys/proctable/constants.rb +0 -0
  14. data/lib/bsd/sys/freebsd/sys/proctable/functions.rb +0 -0
  15. data/lib/bsd/sys/freebsd/sys/proctable/structs.rb +0 -0
  16. data/lib/{freebsd → bsd/sys/freebsd}/sys/proctable.rb +1 -1
  17. data/lib/bsd/sys/proctable.rb +8 -0
  18. data/lib/darwin/sys/proctable.rb +53 -20
  19. data/lib/linux/sys/proctable/cgroup_entry.rb +4 -2
  20. data/lib/linux/sys/proctable/smaps.rb +29 -17
  21. data/lib/linux/sys/proctable.rb +41 -35
  22. data/lib/sunos/sys/proctable.rb +2 -2
  23. data/lib/sys/proctable/version.rb +1 -1
  24. data/lib/sys/proctable.rb +2 -2
  25. data/lib/sys/top.rb +7 -2
  26. data/lib/windows/sys/proctable.rb +36 -32
  27. data/spec/spec_helper.rb +15 -0
  28. data/spec/sys_proctable_aix_spec.rb +74 -76
  29. data/spec/sys_proctable_all_spec.rb +45 -45
  30. data/spec/sys_proctable_bsd_spec.rb +244 -0
  31. data/spec/sys_proctable_darwin_spec.rb +85 -58
  32. data/spec/sys_proctable_linux_spec.rb +196 -195
  33. data/spec/sys_proctable_sunos_spec.rb +190 -192
  34. data/spec/sys_proctable_windows_spec.rb +153 -153
  35. data/spec/sys_top_spec.rb +20 -21
  36. data/sys-proctable.gemspec +16 -24
  37. data.tar.gz.sig +0 -0
  38. metadata +78 -18
  39. metadata.gz.sig +0 -0
  40. data/spec/sys_proctable_freebsd_spec.rb +0 -210
@@ -0,0 +1,244 @@
1
+ ################################################################
2
+ # sys_proctable_bsd_rspec.rb
3
+ #
4
+ # Specs for BSD related operating systems for the sys-proctable
5
+ # library. You should run these tests via the 'rake spec' task.
6
+ ################################################################
7
+ require 'spec_helper'
8
+ require 'mkmf-lite'
9
+
10
+ RSpec.describe Sys::ProcTable, :bsd do
11
+ let(:fields_freebsd){
12
+ %w[
13
+ pid ppid pgid tpgid sid tsid jobc uid ruid rgid
14
+ ngroups groups size rssize swrss tsize dsize ssize
15
+ xstat acflag pctcpu estcpu slptime swtime runtime start
16
+ flag state nice lock rqindex oncpu lastcpu wmesg login
17
+ lockname comm ttynum ttydev jid priority usrpri cmdline
18
+ utime stime maxrss ixrss idrss isrss minflt majflt nswap
19
+ inblock oublock msgsnd msgrcv nsignals nvcsw nivcsw
20
+ ]
21
+ }
22
+
23
+ let(:fields_dragonfly){
24
+ %w[
25
+ paddr flags stat lock acflag traceflag fd siglist sigignore
26
+ sigcatch sigflag start comm uid ngroups groups ruid svuid
27
+ rgid svgid pid ppid pgid jobc sid login tdev tpgid tsid exitstat
28
+ nthreads nice swtime vm_map_size vm_rssize vm_swrss vm_tsize
29
+ vm_dsize vm_ssize vm_prssize jailid ru cru auxflags lwp ktaddr
30
+ ]
31
+ }
32
+
33
+ context 'fields singleton method' do
34
+ it 'responds to a fields method' do
35
+ expect(described_class).to respond_to(:fields)
36
+ end
37
+
38
+ it 'returns the expected results for the fields method' do
39
+ fields = RbConfig::CONFIG['host_os'] =~ /freebsd/i ? fields_freebsd : fields_dragonfly
40
+ expect(described_class.fields).to be_kind_of(Array)
41
+ expect(described_class.fields).to eql(fields)
42
+ end
43
+ end
44
+
45
+ context 'ProcTable::Struct members' do
46
+ subject(:process){ described_class.ps(:pid => Process.pid) }
47
+
48
+ it 'contains a pid member and returns the expected value' do
49
+ expect(process).to respond_to(:pid)
50
+ expect(process.pid).to be_kind_of(Numeric)
51
+ expect(process.pid).to eql(Process.pid)
52
+ end
53
+
54
+ it 'contains a ppid member and returns the expected value' do
55
+ expect(process).to respond_to(:ppid)
56
+ expect(process.ppid).to be_kind_of(Integer)
57
+ end
58
+
59
+ it 'contains a pgid member and returns the expected value' do
60
+ expect(process).to respond_to(:pgid)
61
+ expect(process.pgid).to be_kind_of(Integer)
62
+ end
63
+
64
+ it 'contains a ruid member and returns the expected value' do
65
+ expect(process).to respond_to(:ruid)
66
+ expect(process.ruid).to be_kind_of(Integer)
67
+ end
68
+
69
+ it 'contains a rgid member and returns the expected value' do
70
+ expect(process).to respond_to(:rgid)
71
+ expect(process.rgid).to be_kind_of(Integer)
72
+ end
73
+
74
+ it 'contains a comm member and returns the expected value' do
75
+ expect(process).to respond_to(:comm)
76
+ expect(process.comm).to be_kind_of(String)
77
+ end
78
+
79
+ it 'contains a state member and returns the expected value', :freebsd do
80
+ expect(process).to respond_to(:state)
81
+ expect(process.state).to be_kind_of(String)
82
+ end
83
+
84
+ it 'contains a pctcpu member and returns the expected value', :freebsd do
85
+ expect(process).to respond_to(:pctcpu)
86
+ expect(process.pctcpu).to be_kind_of(Float)
87
+ end
88
+
89
+ it 'contains a oncpu member and returns the expected value', :freebsd do
90
+ expect(process).to respond_to(:oncpu)
91
+ expect(process.oncpu).to be_kind_of(Integer)
92
+ end
93
+
94
+ it 'contains a ttynum member and returns the expected value', :freebsd do
95
+ expect(process).to respond_to(:ttynum)
96
+ expect(process.ttynum).to be_kind_of(Integer)
97
+ end
98
+
99
+ it 'contains a ttydev member and returns the expected value', :freebsd do
100
+ expect(process).to respond_to(:ttydev)
101
+ expect(process.ttydev).to be_kind_of(String)
102
+ end
103
+
104
+ it 'contains a wmesg member and returns the expected value', :freebsd do
105
+ expect(process).to respond_to(:wmesg)
106
+ expect(process.wmesg).to be_kind_of(String)
107
+ end
108
+
109
+ it 'contains a runtime member and returns the expected value', :freebsd do
110
+ expect(process).to respond_to(:runtime)
111
+ expect(process.runtime).to be_kind_of(Integer)
112
+ end
113
+
114
+ it 'contains a priority member and returns the expected value', :freebsd do
115
+ expect(process).to respond_to(:priority)
116
+ expect(process.priority).to be_kind_of(Integer)
117
+ end
118
+
119
+ it 'contains a usrpri member and returns the expected value', :freebsd do
120
+ expect(process).to respond_to(:usrpri)
121
+ expect(process.usrpri).to be_kind_of(Integer)
122
+ end
123
+
124
+ it 'contains a nice member and returns the expected value' do
125
+ expect(process).to respond_to(:nice)
126
+ expect(process.nice).to be_kind_of(Integer)
127
+ end
128
+
129
+ it 'contains a cmdline member and returns the expected value' do
130
+ expect(process).to respond_to(:cmdline)
131
+ expect(process.cmdline).to be_kind_of(String)
132
+ end
133
+
134
+ it 'contains a start member and returns the expected value' do
135
+ expect(process).to respond_to(:start)
136
+ expect(process.start).to be_kind_of(Time)
137
+ end
138
+
139
+ it 'contains a maxrss member and returns the expected value', :freebsd do
140
+ expect(process).to respond_to(:maxrss)
141
+ expect(process.maxrss).to be_kind_of(Integer)
142
+ end
143
+
144
+ it 'contains a ixrss member and returns the expected value', :freebsd do
145
+ expect(process).to respond_to(:ixrss)
146
+ expect(process.ixrss).to be_kind_of(Integer)
147
+ end
148
+
149
+ # TODO: The value returned on PC BSD 10 does not appear to be valid. Investigate.
150
+ it 'contains a idrss member and returns the expected value', :freebsd do
151
+ expect(process).to respond_to(:idrss)
152
+ expect(process.idrss).to be_kind_of(Numeric)
153
+ end
154
+
155
+ it 'contains a isrss member and returns the expected value', :freebsd do
156
+ expect(process).to respond_to(:isrss)
157
+ expect(process.isrss).to be_kind_of(Integer)
158
+ end
159
+
160
+ it 'contains a minflt member and returns the expected value', :freebsd do
161
+ expect(process).to respond_to(:minflt)
162
+ expect(process.minflt).to be_kind_of(Integer)
163
+ end
164
+
165
+ it 'contains a majflt member and returns the expected value', :freebsd do
166
+ expect(process).to respond_to(:majflt)
167
+ expect(process.majflt).to be_kind_of(Integer)
168
+ end
169
+
170
+ it 'contains a nswap member and returns the expected value', :freebsd do
171
+ expect(process).to respond_to(:nswap)
172
+ expect(process.nswap).to be_kind_of(Integer)
173
+ end
174
+
175
+ it 'contains a inblock member and returns the expected value', :freebsd do
176
+ expect(process).to respond_to(:inblock)
177
+ expect(process.inblock).to be_kind_of(Integer)
178
+ end
179
+
180
+ it 'contains a oublock member and returns the expected value', :freebsd do
181
+ expect(process).to respond_to(:oublock)
182
+ expect(process.oublock).to be_kind_of(Integer)
183
+ end
184
+
185
+ it 'contains a msgsnd member and returns the expected value', :freebsd do
186
+ expect(process).to respond_to(:msgsnd)
187
+ expect(process.msgsnd).to be_kind_of(Integer)
188
+ end
189
+
190
+ it 'contains a msgrcv member and returns the expected value', :freebsd do
191
+ expect(process).to respond_to(:msgrcv)
192
+ expect(process.msgrcv).to be_kind_of(Integer)
193
+ end
194
+
195
+ it 'contains a nsignals member and returns the expected value', :freebsd do
196
+ expect(process).to respond_to(:nsignals)
197
+ expect(process.nsignals).to be_kind_of(Integer)
198
+ end
199
+
200
+ it 'contains a nvcsw member and returns the expected value', :freebsd do
201
+ expect(process).to respond_to(:nvcsw)
202
+ expect(process.nvcsw).to be_kind_of(Integer)
203
+ end
204
+
205
+ it 'contains a nivcsw member and returns the expected value', :freebsd do
206
+ expect(process).to respond_to(:nivcsw)
207
+ expect(process.nivcsw).to be_kind_of(Integer)
208
+ end
209
+
210
+ it 'contains a utime member and returns the expected value', :freebsd do
211
+ expect(process).to respond_to(:utime)
212
+ expect(process.utime).to be_kind_of(Integer)
213
+ end
214
+
215
+ it 'contains a stime member and returns the expected value', :freebsd do
216
+ expect(process).to respond_to(:stime)
217
+ expect(process.stime).to be_kind_of(Integer)
218
+ end
219
+ end
220
+
221
+ context 'C struct verification' do
222
+ let(:dummy){ Class.new{ extend Mkmf::Lite } }
223
+
224
+ it 'has a timeval struct of the expected size' do
225
+ expect(Sys::ProcTableStructs::Timeval.size).to eq(dummy.check_sizeof('struct timeval', 'sys/time.h'))
226
+ end
227
+
228
+ it 'has an rtprio struct of the expected size' do
229
+ expect(Sys::ProcTableStructs::RTPrio.size).to eq(dummy.check_sizeof('struct rtprio', 'sys/rtprio.h'))
230
+ end
231
+
232
+ it 'has an rusage struct of the expected size' do
233
+ expect(Sys::ProcTableStructs::Rusage.size).to eq(dummy.check_sizeof('struct rusage', 'sys/resource.h'))
234
+ end
235
+
236
+ it 'has an kinfo_lwp struct of the expected size' do
237
+ expect(Sys::ProcTableStructs::KInfoLWP.size).to eq(dummy.check_sizeof('struct kinfo_lwp', 'sys/kinfo.h'))
238
+ end
239
+
240
+ it 'has an kinfo_proc struct of the expected size' do
241
+ expect(Sys::ProcTableStructs::KInfoProc.size).to eq(dummy.check_sizeof('struct kinfo_proc', 'sys/kinfo.h'))
242
+ end
243
+ end
244
+ end
@@ -4,11 +4,9 @@
4
4
  # Test suite for the Darwin version of the sys-proctable library. You
5
5
  # should run these tests via the 'rake test' task.
6
6
  ########################################################################
7
- require 'rspec'
8
- require 'sys/proctable'
9
- require_relative 'sys_proctable_all_spec'
7
+ require 'spec_helper'
10
8
 
11
- describe Sys::ProcTable do
9
+ RSpec.describe Sys::ProcTable, :darwin do
12
10
  let(:fields){
13
11
  %w[
14
12
  flags status xstatus pid ppid uid gid ruid rgid svuid svgid rfu1 comm
@@ -21,8 +19,8 @@ describe Sys::ProcTable do
21
19
  }
22
20
 
23
21
  before(:all) do
24
- @pid1 = Process.spawn({'A' => 'B', 'Z' => nil}, "sleep 60")
25
- @pid2 = Process.spawn("ruby", "-Ilib", "-e", "sleep \'120\'.to_i", "--", "foo bar")
22
+ @pid1 = Process.spawn({'A' => 'B', 'Z' => nil}, 'sleep 60')
23
+ @pid2 = Process.spawn('ruby', '-Ilib', '-e', "sleep \'120\'.to_i", '--', 'foo bar')
26
24
  sleep 1 # wait to make sure env is replaced by sleep
27
25
  end
28
26
 
@@ -31,90 +29,119 @@ describe Sys::ProcTable do
31
29
  Process.kill('TERM', @pid2)
32
30
  end
33
31
 
34
- context "fields singleton method" do
35
- it "responds to a fields method" do
32
+ context 'fields singleton method' do
33
+ it 'responds to a fields method' do
36
34
  expect(described_class).to respond_to(:fields)
37
35
  end
38
36
 
39
- it "returns the expected results for the fields method" do
37
+ it 'returns the expected results for the fields method' do
40
38
  expect(described_class.fields).to be_kind_of(Array)
41
39
  expect(described_class.fields).to eq(fields)
42
40
  end
43
41
  end
44
42
 
45
- context "ProcTable::Struct members" do
46
- subject { described_class.ps(pid: @pid1) }
43
+ context 'ProcTable::Struct members' do
44
+ subject(:process){ described_class.ps(:pid => @pid1) }
47
45
 
48
- it "contains a pid member and returns the expected value" do
49
- expect(subject).to respond_to(:pid)
50
- expect(subject.pid).to be_kind_of(Numeric)
51
- expect(subject.pid).to eq(@pid1)
46
+ it 'contains a pid member and returns the expected value' do
47
+ expect(process).to respond_to(:pid)
48
+ expect(process.pid).to be_kind_of(Numeric)
49
+ expect(process.pid).to eq(@pid1)
52
50
  end
53
51
 
54
- it "contains a ppid member and returns the expected value" do
55
- expect(subject).to respond_to(:ppid)
56
- expect(subject.ppid).to be_kind_of(Numeric)
57
- expect(subject.ppid).to eq(Process.pid)
52
+ it 'contains a ppid member and returns the expected value' do
53
+ expect(process).to respond_to(:ppid)
54
+ expect(process.ppid).to be_kind_of(Numeric)
55
+ expect(process.ppid).to eq(Process.pid)
58
56
  end
59
57
 
60
- it "contains a pgid member and returns the expected value" do
61
- expect(subject).to respond_to(:pgid)
62
- expect(subject.pgid).to be_kind_of(Numeric)
63
- expect(subject.pgid).to eq(Process.getpgrp)
58
+ it 'contains a pgid member and returns the expected value' do
59
+ expect(process).to respond_to(:pgid)
60
+ expect(process.pgid).to be_kind_of(Numeric)
61
+ expect(process.pgid).to eq(Process.getpgrp)
64
62
  end
65
63
 
66
- it "contains a ruid member and returns the expected value" do
67
- expect(subject).to respond_to(:ruid)
68
- expect(subject.ruid).to be_kind_of(Numeric)
69
- expect(subject.ruid).to eq(Process.uid)
64
+ it 'contains a ruid member and returns the expected value' do
65
+ expect(process).to respond_to(:ruid)
66
+ expect(process.ruid).to be_kind_of(Numeric)
67
+ expect(process.ruid).to eq(Process.uid)
70
68
  end
71
69
 
72
- it "contains an rgid member and returns the expected value" do
73
- expect(subject).to respond_to(:rgid)
74
- expect(subject.rgid).to be_kind_of(Numeric)
75
- expect(subject.rgid).to eq(Process.gid)
70
+ it 'contains an rgid member and returns the expected value' do
71
+ expect(process).to respond_to(:rgid)
72
+ expect(process.rgid).to be_kind_of(Numeric)
73
+ expect(process.rgid).to eq(Process.gid)
76
74
  end
77
75
 
78
- it "contains an svuid member and returns the expected value" do
79
- expect(subject).to respond_to(:svuid)
80
- expect(subject.svuid).to be_kind_of(Numeric)
81
- expect(subject.svuid).to eq(Process.uid)
76
+ it 'contains an svuid member and returns the expected value' do
77
+ expect(process).to respond_to(:svuid)
78
+ expect(process.svuid).to be_kind_of(Numeric)
79
+ expect(process.svuid).to eq(Process.uid)
82
80
  end
83
81
 
84
- it "contains an svgid member and returns the expected value" do
85
- expect(subject).to respond_to(:svgid)
86
- expect(subject.svgid).to be_kind_of(Numeric)
87
- expect(subject.svgid).to eq(Process.gid)
82
+ it 'contains an svgid member and returns the expected value' do
83
+ expect(process).to respond_to(:svgid)
84
+ expect(process.svgid).to be_kind_of(Numeric)
85
+ expect(process.svgid).to eq(Process.gid)
88
86
  end
89
87
 
90
- it "contains a comm member and returns the expected value" do
91
- expect(subject).to respond_to(:comm)
92
- expect(subject.comm).to be_kind_of(String)
93
- expect(subject.comm).to eq('sleep')
88
+ it 'contains a comm member and returns the expected value' do
89
+ expect(process).to respond_to(:comm)
90
+ expect(process.comm).to be_kind_of(String)
91
+ expect(process.comm).to eq('sleep')
94
92
  end
95
93
 
96
- it "contains a cmdline member and returns the expected value" do
97
- expect(subject).to respond_to(:cmdline)
98
- expect(subject.cmdline).to be_kind_of(String)
99
- expect(subject.cmdline).to eq('sleep 60')
94
+ it 'contains a cmdline member and returns the expected value' do
95
+ expect(process).to respond_to(:cmdline)
96
+ expect(process.cmdline).to be_kind_of(String)
97
+ expect(process.cmdline).to eq('sleep 60')
100
98
  end
101
99
 
102
- it "returns a string with the expected arguments for the cmdline member" do
103
- ptable = Sys::ProcTable.ps(pid: @pid2)
100
+ it 'returns a string with the expected arguments for the cmdline member', :skip => :jruby do
101
+ ptable = Sys::ProcTable.ps(:pid => @pid2)
104
102
  expect(ptable.cmdline).to eq('ruby -Ilib -e sleep \'120\'.to_i -- foo bar')
105
103
  end
106
104
 
107
- it "contains an exe member and returns the expected value" do
108
- expect(subject).to respond_to(:exe)
109
- expect(subject.exe).to be_kind_of(String)
110
- expect(subject.exe).to eq(`which sleep`.chomp)
105
+ it 'contains an exe member and returns the expected value' do
106
+ expect(process).to respond_to(:exe)
107
+ expect(process.exe).to be_kind_of(String)
108
+ expect(process.exe).to eq(`which sleep`.chomp)
111
109
  end
112
110
 
113
- it "contains an environ member and returns the expected value" do
114
- expect(subject).to respond_to(:environ)
115
- expect(subject.environ).to be_kind_of(Hash)
116
- expect(subject.environ['A']).to eq('B')
117
- expect(subject.environ['Z']).to be_nil
111
+ it 'contains an environ member and returns the expected value' do
112
+ skip 'It appears to no longer be possible to get environ on spawned processes on Catalina or later in most cases'
113
+ expect(process).to respond_to(:environ)
114
+ expect(process.environ).to be_kind_of(Hash)
115
+ expect(process.environ['A']).to eq('B')
116
+ expect(process.environ['Z']).to be_nil
117
+ end
118
+ end
119
+
120
+ context 'private constants' do
121
+ it 'makes FFI methods private' do
122
+ expect(described_class).not_to respond_to(:sysctl)
123
+ expect(described_class).not_to respond_to(:proc_listallpids)
124
+ expect(described_class).not_to respond_to(:proc_pidinfo)
125
+ end
126
+
127
+ it 'makes FFI structs private' do
128
+ expect(described_class.constants).not_to include(:ProcBsdInfo)
129
+ expect(described_class.constants).not_to include(:ProcThreadInfo)
130
+ expect(described_class.constants).not_to include(:ProcTaskInfo)
131
+ expect(described_class.constants).not_to include(:ProcTaskAllInfo)
132
+ end
133
+
134
+ it 'makes internal constants private' do
135
+ expect(described_class.constants).not_to include(:PROC_PIDTASKALLINFO)
136
+ expect(described_class.constants).not_to include(:PROC_PIDTHREADINFO)
137
+ expect(described_class.constants).not_to include(:PROC_PIDLISTTHREADS)
138
+ expect(described_class.constants).not_to include(:CTL_KERN)
139
+ expect(described_class.constants).not_to include(:KERN_PROCARGS)
140
+ expect(described_class.constants).not_to include(:KERN_PROCARGS2)
141
+ expect(described_class.constants).not_to include(:MAX_COMLEN)
142
+ expect(described_class.constants).not_to include(:MAX_PATHLEN)
143
+ expect(described_class.constants).not_to include(:MAXTHREADNAMESIZE)
144
+ expect(described_class.constants).not_to include(:PROC_PIDPATHINFO_MAXSIZE)
118
145
  end
119
146
  end
120
147
  end