xref: /freebsd/usr.bin/renice/tests/renice_test.sh (revision 04a036601e10237ae00655e515aeb78762eb5d1a)
1#
2# Copyright (c) 2022-2023 Klara, Inc.
3#
4# SPDX-License-Identifier: BSD-2-Clause
5#
6
7# Name of user to use for -u tests when running as root.  Beware that
8# processes owned by that user will be affected by the test.
9TEST_USER=nobody
10
11_renice() {
12	atf_check -o empty -e ignore -s exit:0 renice "$@"
13}
14
15atf_test_case renice_abs_pid
16renice_abs_pid_head() {
17	atf_set "descr" "Set a process's nice number to an absolute value"
18}
19renice_abs_pid_body() {
20	local pid nice incr
21	sleep 60 &
22	pid=$!
23	nice="$(ps -o nice= -p $pid)"
24	incr=3
25	_renice $((nice+incr)) $pid
26	atf_check_equal $((nice+incr)) "$(ps -o nice= -p $pid)"
27	kill $pid
28}
29
30atf_test_case renice_rel_pid
31renice_rel_pid_head() {
32	atf_set "descr" "Change a process's nice number by a relative value"
33}
34renice_rel_pid_body() {
35	local pid nice incr
36	sleep 60 &
37	pid=$!
38	nice="$(ps -o nice= -p $pid)"
39	incr=3
40	_renice -n $incr $pid
41	_renice -p -n $incr $pid
42	_renice -n $incr -p $pid
43	atf_check_equal $((nice+incr+incr+incr)) "$(ps -o nice= -p $pid)"
44	kill $pid
45}
46
47atf_test_case renice_abs_pgid
48renice_abs_pgid_head() {
49	atf_set "descr" "Set a process group's nice number to an absolute value"
50}
51renice_abs_pgid_body() {
52	local pid pgid nice incr
53	# make sure target runs in a different pgrp than ours
54	pid=$(sh -mc "sleep 60 >/dev/null & echo \$!")
55	pgid="$(ps -o pgid= -p $pid)"
56	nice="$(ps -o nice= -p $pid)"
57	incr=3
58	_renice $((nice+incr)) -g $pgid
59	atf_check_equal $((nice+incr)) "$(ps -o nice= -p $pid)"
60	kill $pid
61}
62
63atf_test_case renice_rel_pgid
64renice_rel_pgid_head() {
65	atf_set "descr" "Change a process group's nice number by a relative value"
66}
67renice_rel_pgid_body() {
68	local pid pgid nice incr
69	# make sure target runs in a different pgrp than ours
70	pid=$(sh -mc "sleep 60 >/dev/null & echo \$!")
71	pgid="$(ps -o pgid= -p $pid)"
72	nice="$(ps -o nice= -p $pid)"
73	incr=3
74	_renice -g -n $incr $pgid
75	_renice -n $incr -g $pgid
76	atf_check_equal $((nice+incr+incr)) "$(ps -o nice= -p $pid)"
77	kill $pid
78}
79
80atf_test_case renice_abs_user
81renice_abs_user_head() {
82	atf_set "descr" "Set a user's processes' nice numbers to an absolute value"
83	atf_set "require.user" "root"
84}
85renice_abs_user_body() {
86	local user pid nice incr
87	pid=$(su -m $TEST_USER -c "/bin/sh -c 'sleep 60 >/dev/null & echo \$!'")
88	nice="$(ps -o nice= -p $pid)"
89	incr=3
90	_renice $((nice+incr)) -u $TEST_USER
91	atf_check_equal $((nice+incr)) "$(ps -o nice= -p $pid)"
92	kill $pid
93}
94
95atf_test_case renice_rel_user
96renice_rel_user_head() {
97	atf_set "descr" "Change a user's processes' nice numbers by a relative value"
98	atf_set "require.user" "root"
99}
100renice_rel_user_body() {
101	local user pid nice incr
102	pid=$(su -m $TEST_USER -c "/bin/sh -c 'sleep 60 >/dev/null & echo \$!'")
103	nice="$(ps -o nice= -p $pid)"
104	incr=3
105	_renice -u -n $incr $TEST_USER
106	_renice -n $incr -u $TEST_USER
107	atf_check_equal $((nice+incr+incr)) "$(ps -o nice= -p $pid)"
108	kill $pid
109}
110
111atf_test_case renice_delim
112renice_delim_head() {
113	atf_set "descr" "Test various delimiter positions"
114}
115renice_delim_body() {
116	local pid nice incr
117	sleep 60 &
118	pid=$!
119	nice="$(ps -o nice= -p $pid)"
120	incr=0
121	# without -p
122	: $((incr=incr+1))
123	_renice -- $((nice+incr)) $pid
124	atf_check_equal $((nice+incr)) "$(ps -o nice= -p $pid)"
125	: $((incr=incr+1))
126	_renice $((nice+incr)) -- $pid
127	atf_check_equal $((nice+incr)) "$(ps -o nice= -p $pid)"
128	: $((incr=incr+1))
129	_renice $((nice+incr)) $pid --
130	atf_check_equal $((nice+incr)) "$(ps -o nice= -p $pid)"
131	# with -p
132	: $((incr=incr+1))
133	_renice -p -- $((nice+incr)) $pid
134	atf_check_equal $((nice+incr)) "$(ps -o nice= -p $pid)"
135	: $((incr=incr+1))
136	_renice -p $((nice+incr)) -- $pid
137	atf_check_equal $((nice+incr)) "$(ps -o nice= -p $pid)"
138	: $((incr=incr+1))
139	_renice -p $((nice+incr)) $pid --
140	atf_check_equal $((nice+incr)) "$(ps -o nice= -p $pid)"
141	: $((incr=incr+1))
142	_renice $((nice+incr)) -p -- $pid
143	atf_check_equal $((nice+incr)) "$(ps -o nice= -p $pid)"
144	: $((incr=incr+1))
145	_renice $((nice+incr)) -p $pid --
146	atf_check_equal $((nice+incr)) "$(ps -o nice= -p $pid)"
147	kill $pid
148}
149
150atf_test_case renice_incr_noarg
151renice_incr_noarg_head() {
152	atf_set "descr" "Do not segfault if -n is given without an argument"
153}
154renice_incr_noarg_body() {
155	atf_check -o empty -e ignore -s exit:1 renice -n
156}
157
158atf_init_test_cases() {
159	atf_add_test_case renice_abs_pid
160	atf_add_test_case renice_rel_pid
161	atf_add_test_case renice_abs_pgid
162	atf_add_test_case renice_rel_pgid
163	atf_add_test_case renice_abs_user
164	atf_add_test_case renice_rel_user
165	atf_add_test_case renice_delim
166	atf_add_test_case renice_incr_noarg
167}
168