sys-proctable 1.2.6 → 1.3.0

Sign up to get free protection for your applications and to get access to all the features.
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