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 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147
|
########################################################################
# sys_proctable_darwin_spec.rb
#
# Test suite for the Darwin version of the sys-proctable library. You
# should run these tests via the 'rake test' task.
########################################################################
require 'spec_helper'
RSpec.describe Sys::ProcTable, :darwin do
let(:fields){
%w[
flags status xstatus pid ppid uid gid ruid rgid svuid svgid rfu1 comm
name nfiles pgid pjobc tdev tpgid nice start_tvsec start_tvusec
virtual_size resident_size total_user total_system threads_user
threads_system policy faults pageins cow_faults messages_sent
messages_received syscalls_mach syscalls_unix csw threadnum numrunning
priority cmdline exe environ threadinfo
]
}
before(:all) do
@pid1 = Process.spawn({'A' => 'B', 'Z' => nil}, 'sleep 60')
@pid2 = Process.spawn('ruby', '-Ilib', '-e', "sleep \'120\'.to_i", '--', 'foo bar')
sleep 1 # wait to make sure env is replaced by sleep
end
after(:all) do
Process.kill('TERM', @pid1)
Process.kill('TERM', @pid2)
end
context 'fields singleton method' do
it 'responds to a fields method' do
expect(described_class).to respond_to(:fields)
end
it 'returns the expected results for the fields method' do
expect(described_class.fields).to be_kind_of(Array)
expect(described_class.fields).to eq(fields)
end
end
context 'ProcTable::Struct members' do
subject(:process){ described_class.ps(:pid => @pid1) }
it 'contains a pid member and returns the expected value' do
expect(process).to respond_to(:pid)
expect(process.pid).to be_kind_of(Numeric)
expect(process.pid).to eq(@pid1)
end
it 'contains a ppid member and returns the expected value' do
expect(process).to respond_to(:ppid)
expect(process.ppid).to be_kind_of(Numeric)
expect(process.ppid).to eq(Process.pid)
end
it 'contains a pgid member and returns the expected value' do
expect(process).to respond_to(:pgid)
expect(process.pgid).to be_kind_of(Numeric)
expect(process.pgid).to eq(Process.getpgrp)
end
it 'contains a ruid member and returns the expected value' do
expect(process).to respond_to(:ruid)
expect(process.ruid).to be_kind_of(Numeric)
expect(process.ruid).to eq(Process.uid)
end
it 'contains an rgid member and returns the expected value' do
expect(process).to respond_to(:rgid)
expect(process.rgid).to be_kind_of(Numeric)
expect(process.rgid).to eq(Process.gid)
end
it 'contains an svuid member and returns the expected value' do
expect(process).to respond_to(:svuid)
expect(process.svuid).to be_kind_of(Numeric)
expect(process.svuid).to eq(Process.uid)
end
it 'contains an svgid member and returns the expected value' do
expect(process).to respond_to(:svgid)
expect(process.svgid).to be_kind_of(Numeric)
expect(process.svgid).to eq(Process.gid)
end
it 'contains a comm member and returns the expected value' do
expect(process).to respond_to(:comm)
expect(process.comm).to be_kind_of(String)
expect(process.comm).to eq('sleep')
end
it 'contains a cmdline member and returns the expected value' do
expect(process).to respond_to(:cmdline)
expect(process.cmdline).to be_kind_of(String)
expect(process.cmdline).to eq('sleep 60')
end
it 'returns a string with the expected arguments for the cmdline member', :skip => :jruby do
ptable = Sys::ProcTable.ps(:pid => @pid2)
expect(ptable.cmdline).to eq('ruby -Ilib -e sleep \'120\'.to_i -- foo bar')
end
it 'contains an exe member and returns the expected value' do
expect(process).to respond_to(:exe)
expect(process.exe).to be_kind_of(String)
expect(process.exe).to eq(`which sleep`.chomp)
end
it 'contains an environ member and returns the expected value' do
skip 'It appears to no longer be possible to get environ on spawned processes on Catalina or later in most cases'
expect(process).to respond_to(:environ)
expect(process.environ).to be_kind_of(Hash)
expect(process.environ['A']).to eq('B')
expect(process.environ['Z']).to be_nil
end
end
context 'private constants' do
it 'makes FFI methods private' do
expect(described_class).not_to respond_to(:sysctl)
expect(described_class).not_to respond_to(:proc_listallpids)
expect(described_class).not_to respond_to(:proc_pidinfo)
end
it 'makes FFI structs private' do
expect(described_class.constants).not_to include(:ProcBsdInfo)
expect(described_class.constants).not_to include(:ProcThreadInfo)
expect(described_class.constants).not_to include(:ProcTaskInfo)
expect(described_class.constants).not_to include(:ProcTaskAllInfo)
end
it 'makes internal constants private' do
expect(described_class.constants).not_to include(:PROC_PIDTASKALLINFO)
expect(described_class.constants).not_to include(:PROC_PIDTHREADINFO)
expect(described_class.constants).not_to include(:PROC_PIDLISTTHREADS)
expect(described_class.constants).not_to include(:CTL_KERN)
expect(described_class.constants).not_to include(:KERN_PROCARGS)
expect(described_class.constants).not_to include(:KERN_PROCARGS2)
expect(described_class.constants).not_to include(:MAX_COMLEN)
expect(described_class.constants).not_to include(:MAX_PATHLEN)
expect(described_class.constants).not_to include(:MAXTHREADNAMESIZE)
expect(described_class.constants).not_to include(:PROC_PIDPATHINFO_MAXSIZE)
end
end
end
|