inspec/test/unit/resources/processes_test.rb
Raphael Geissert b2e62b5b2f Run ps with an ulimited width on linux
On some systems the output of ps may be truncated, which may prevent
profiles from working as intended.

Some implementations specifically mention that the output width is
undefined "(it may be 80, unlimited, determined by the TERM variable,
and so on)".

This fixes #5226.

Signed-off-by: Raphael Geissert <atomo64@gmail.com>
2020-09-02 08:34:11 +02:00

233 lines
7.1 KiB
Ruby

require "helper"
require "inspec/resource"
require "inspec/resources/processes"
describe "Inspec::Resources::Processes" do
it "handles empty process results" do
resource = load_resource("processes", "nothing")
_(resource.entries).must_equal []
end
it "verify processes resource" do
resource = MockLoader.new(:freebsd10).load_resource("processes", "login -fp apop")
expect_deprecation(:property_processes_list) do
_(resource.list.length).must_equal 2
end
_(resource.entries.length).must_equal 2
_(resource.entries[0].to_h).must_equal({
label: nil,
pid: 7115,
cpu: "0.3",
mem: "0.0",
vsz: 2516588,
rss: 3052,
tty: "ttys008",
stat: "U",
start: "Fri05PM",
time: "0:00.05",
user: "root",
command: "login -fp apop",
})
end
it "verify processes resource on linux os" do
resource = MockLoader.new(:centos6).load_resource("processes", "postgres: bifrost bifrost")
_(resource.entries.length).must_equal 1
_(resource.entries[0].to_h).must_equal({
label: "system_u:system_r:init_t:s0",
pid: 5127,
cpu: "0.0",
mem: "0.2",
vsz: 547208,
rss: 5376,
tty: "?",
stat: "Ss",
start: "10:54:22",
time: "00:00:00",
user: "opscode-pgsql",
command: "postgres: bifrost bifrost 127.0.0.1(43699) idle",
})
end
it "verify processes resource using where filters on linux os. String match regex" do
resource = MockLoader.new(:centos6).load_resource("processes", ".+")
_(resource.entries.length).must_equal 8
_(resource.where { pid < 11663 && cpu == "0.0" }.users).must_equal(%w{opscode-pgsql opscode root httpd})
_(resource.where { user =~ /opscode-.*/ }.entries[0].to_h).must_equal({
label: "system_u:system_r:init_t:s0",
pid: 5127,
cpu: "0.0",
mem: "0.2",
vsz: 547208,
rss: 5376,
tty: "?",
stat: "Ss",
start: "10:54:22",
time: "00:00:00",
user: "opscode-pgsql",
command: "postgres: bifrost bifrost 127.0.0.1(43699) idle",
})
end
it "verify long-run processes resource on linux os" do
resource = MockLoader.new(:centos6).load_resource("processes", "httpd")
_(resource.entries.length).must_equal 4
_(resource.entries[0].to_h).must_equal({
label: "-",
pid: 4589,
cpu: "0.0",
mem: "0.0",
vsz: 70992,
rss: 2864,
tty: "?",
stat: "Ss",
start: "Nov 09",
time: "00:01:01",
user: "root",
command: "/usr/local/apache2/bin/httpd -k start",
})
end
it "access information of a process" do
resource = MockLoader.new(:centos6).load_resource("processes", "postgres: bifrost bifrost")
process = resource.entries[0]
_(process.user).must_equal "opscode-pgsql"
_(process[:user]).must_equal "opscode-pgsql"
_(process["user"]).must_equal "opscode-pgsql"
_(process[-1]).must_equal "postgres: bifrost bifrost 127.0.0.1(43699) idle"
_(process[1]).must_equal 5127
end
it "retrieves the users and states as arrays" do
resource = MockLoader.new(:freebsd10).load_resource("processes", "login -fp apop")
_(resource.users.sort).must_equal %w{apop root}
_(resource.states.sort).must_equal %w{Ss U}
end
it "retrieves the users and states as arrays on linux os" do
resource = MockLoader.new(:centos6).load_resource("processes", "postgres: bifrost bifrost")
_(resource.users.sort).must_equal ["opscode-pgsql"]
_(resource.states.sort).must_equal ["Ss"]
_(resource.exists?).must_equal true
end
it "command name matches with output (string)" do
resource = MockLoader.new(:centos6).load_resource("processes", "mysqld")
_(resource.to_s).must_equal "Processes mysqld"
end
it "command name matches with output (regex)" do
resource = MockLoader.new(:centos6).load_resource("processes", /mysqld/)
_(resource.to_s).must_equal "Processes /mysqld/"
end
it "handles labels with spaces" do
resource = MockLoader.new(:centos6).load_resource("processes", "ntpd")
_(resource.entries.length).must_equal 1
_(resource.entries[0].to_h).must_equal({
label: "/usr/sbin/ntpd (enforce)",
pid: 14415,
cpu: "0.0",
mem: "0.5",
vsz: 110032,
rss: 5164,
tty: "?",
stat: "Ssl",
start: "22:39:25",
time: "00:00:00",
user: "ntp",
command: "/usr/sbin/ntpd -p /var/run/ntpd.pid -g -u 112:117",
})
end
it "handles regular processes from busybox" do
resource = MockLoader.new(:alpine).load_resource("processes", "/some/other/coolprogram")
_(resource.entries.length).must_equal 1
_(resource.entries[0].to_h).must_equal({
label: nil,
pid: 5,
cpu: nil,
mem: nil,
vsz: 1528,
rss: 4,
tty: "136,0",
stat: "R",
start: nil,
time: "0:00",
user: "joe",
command: "/some/other/coolprogram",
})
end
it "handles human readable megabytes from busybox" do
resource = MockLoader.new(:alpine).load_resource("processes", "/a/bigger/program")
_(resource.entries.length).must_equal 1
_(resource.entries[0].to_h).must_equal({
label: nil,
pid: 82,
cpu: nil,
mem: nil,
vsz: 24576,
rss: 2048,
tty: "?",
stat: "S",
start: nil,
time: "3:50",
user: "frank",
command: "/a/bigger/program",
})
end
it "handles human readable gigabytes from busybox" do
resource = MockLoader.new(:alpine).load_resource("processes", "/the/biggest/program")
_(resource.entries.length).must_equal 1
_(resource.entries[0].to_h).must_equal({
label: nil,
pid: 83,
cpu: nil,
mem: nil,
vsz: 2726297,
rss: 1048576,
tty: "?",
stat: "S",
start: nil,
time: "39:00",
user: "tim",
command: "/the/biggest/program",
})
end
it "command name matches with output (string)" do
resource = MockLoader.new(:windows).load_resource("processes", "winlogon.exe")
_(resource.to_s).must_equal "Processes winlogon.exe"
end
it "retrieves the users and states as arrays on windows os" do
resource = MockLoader.new(:windows).load_resource("processes", "winlogon.exe")
_(resource.users.sort).must_equal ['NT AUTHORITY\\SYSTEM']
end
it "process should exist" do
resource = MockLoader.new(:windows).load_resource("processes", "winlogon.exe")
_(resource.exists?).must_equal true
end
it "process should_not exist" do
resource = MockLoader.new(:windows).load_resource("processes", "unicorn.exe")
_(resource.exists?).must_equal false
end
it "returns the correct command for busybox ps" do
resource = MockLoader.new(:alpine).load_resource("processes")
resource.expects(:busybox_ps?).returns(true)
_(resource.send(:ps_configuration_for_linux)[0]).must_equal "ps -o pid,vsz,rss,tty,stat,time,ruser,args"
end
it "returns the correct command for non-busybox linux" do
resource = MockLoader.new(:centos7).load_resource("processes")
resource.expects(:busybox_ps?).returns(false)
_(resource.send(:ps_configuration_for_linux)[0]).must_equal "ps wwaxo label,pid,pcpu,pmem,vsz,rss,tty,stat,start,time,user:32,command"
end
end