File: sys_proctable_darwin_spec.rb

package info (click to toggle)
ruby-sys-proctable 1.3.0-1
  • links: PTS, VCS
  • area: main
  • in suites: bookworm, forky, sid, trixie
  • size: 396 kB
  • sloc: ruby: 3,656; makefile: 3
file content (147 lines) | stat: -rw-r--r-- 5,734 bytes parent folder | download
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