xref: /freebsd/libexec/rc/tests/rc_subr_test.sh (revision 6fa42b91ca3f481912af98c4d49c44507eb1b8e1)
1e7437ae9SMateusz Piotrowski#
2e7437ae9SMateusz Piotrowski# Copyright 2022 Mateusz Piotrowski <0mp@FreeBSD.org>
3e7437ae9SMateusz Piotrowski#
44d846d26SWarner Losh# SPDX-License-Identifier: BSD-2-Clause
5e7437ae9SMateusz Piotrowski#
6e7437ae9SMateusz Piotrowski# Redistribution and use in source and binary forms, with or without
7e7437ae9SMateusz Piotrowski# modification, are permitted provided that the following conditions
8e7437ae9SMateusz Piotrowski# are met:
9e7437ae9SMateusz Piotrowski# 1. Redistributions of source code must retain the above copyright
10e7437ae9SMateusz Piotrowski#    notice, this list of conditions and the following disclaimer.
11e7437ae9SMateusz Piotrowski# 2. Redistributions in binary form must reproduce the above copyright
12e7437ae9SMateusz Piotrowski#    notice, this list of conditions and the following disclaimer in the
13e7437ae9SMateusz Piotrowski#    documentation and/or other materials provided with the distribution.
14e7437ae9SMateusz Piotrowski#
15e7437ae9SMateusz Piotrowski# THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
16e7437ae9SMateusz Piotrowski# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
17e7437ae9SMateusz Piotrowski# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
18e7437ae9SMateusz Piotrowski# ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
19e7437ae9SMateusz Piotrowski# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
20e7437ae9SMateusz Piotrowski# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
21e7437ae9SMateusz Piotrowski# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
22e7437ae9SMateusz Piotrowski# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
23e7437ae9SMateusz Piotrowski# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
24e7437ae9SMateusz Piotrowski# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
25e7437ae9SMateusz Piotrowski# SUCH DAMAGE.
26e7437ae9SMateusz Piotrowski#
27e7437ae9SMateusz Piotrowski
28e7437ae9SMateusz Piotrowskiatf_test_case oomprotect_all
29e7437ae9SMateusz Piotrowskioomprotect_all_head()
30e7437ae9SMateusz Piotrowski{
31e7437ae9SMateusz Piotrowski	atf_set "descr" "Verify that \${name}_oomprotect=all protects " \
32e7437ae9SMateusz Piotrowski		"the command and all its current and future children"
33e7437ae9SMateusz Piotrowski	atf_set "require.user" "root" # For protect(1).
34e7437ae9SMateusz Piotrowski}
35e7437ae9SMateusz Piotrowski
36e7437ae9SMateusz Piotrowskioomprotect_all_body()
37e7437ae9SMateusz Piotrowski{
38*6fa42b91SMateusz Piotrowski	if [ "$(sysctl -n security.jail.jailed)" != 0 ]; then
39*6fa42b91SMateusz Piotrowski		atf_skip "protect(1) cannot be used in a jail"
40*6fa42b91SMateusz Piotrowski	fi
41*6fa42b91SMateusz Piotrowski
42e7437ae9SMateusz Piotrowski	__name="$(atf_get ident)"
43e7437ae9SMateusz Piotrowski	__pidfile="$(mktemp -t "${__name}.pid")"
44e7437ae9SMateusz Piotrowski	__childpidfile="$(mktemp -t "${__name}.childpid")"
45e7437ae9SMateusz Piotrowski	__script=$(mktemp -t "${__name}.script")
46e7437ae9SMateusz Piotrowski
47e7437ae9SMateusz Piotrowski	cat >> "$__script" <<-'LITERAL'
48e7437ae9SMateusz Piotrowski	. /etc/rc.subr
49e7437ae9SMateusz Piotrowski	name="$1"
50e7437ae9SMateusz Piotrowski	pidfile="$2"
51e7437ae9SMateusz Piotrowski	_childpidfile="$3"
52e7437ae9SMateusz Piotrowski	_rc_arg="$4"
53e7437ae9SMateusz Piotrowski	setvar "${name}_oomprotect" all
54e7437ae9SMateusz Piotrowski	command="/usr/sbin/daemon"
55e7437ae9SMateusz Piotrowski	command_args="-P $pidfile -p $_childpidfile -- /bin/sleep 5"
56e7437ae9SMateusz Piotrowski	run_rc_command "$_rc_arg"
57e7437ae9SMateusz Piotrowski	LITERAL
58e7437ae9SMateusz Piotrowski
59e7437ae9SMateusz Piotrowski	atf_check -s exit:0 -o inline:"Starting ${__name}.\n" -e empty \
60e7437ae9SMateusz Piotrowski		/bin/sh "$__script" "$__name" "$__pidfile" "$__childpidfile" onestart
61e7437ae9SMateusz Piotrowski	atf_check -s exit:0 -o match:'^..1..... .......1$' -e empty \
62e7437ae9SMateusz Piotrowski		ps -p "$(cat "$__pidfile")" -ax -o flags,flags2
63e7437ae9SMateusz Piotrowski	atf_check -s exit:0 -o match:'^..1..... .......1$' -e empty \
64e7437ae9SMateusz Piotrowski		ps -p "$(cat "$__childpidfile")" -ax -o flags,flags2
65e7437ae9SMateusz Piotrowski	atf_check -s exit:0 -o ignore -e empty \
66e7437ae9SMateusz Piotrowski		/bin/sh "$__script" "$__name" "$__pidfile" "$__childpidfile" onestop
67e7437ae9SMateusz Piotrowski}
68e7437ae9SMateusz Piotrowski
69e7437ae9SMateusz Piotrowskiatf_test_case oomprotect_yes
70e7437ae9SMateusz Piotrowskioomprotect_yes_head()
71e7437ae9SMateusz Piotrowski{
72e7437ae9SMateusz Piotrowski	atf_set "descr" "Verify that \${name}_oomprotect=yes protects " \
73e7437ae9SMateusz Piotrowski		"the command but not its children"
74e7437ae9SMateusz Piotrowski	atf_set "require.user" "root" # For protect(1).
75e7437ae9SMateusz Piotrowski}
76e7437ae9SMateusz Piotrowski
77e7437ae9SMateusz Piotrowskioomprotect_yes_body()
78e7437ae9SMateusz Piotrowski{
79*6fa42b91SMateusz Piotrowski	if [ "$(sysctl -n security.jail.jailed)" != 0 ]; then
80*6fa42b91SMateusz Piotrowski		atf_skip "protect(1) cannot be used in a jail"
81*6fa42b91SMateusz Piotrowski	fi
82*6fa42b91SMateusz Piotrowski
83e7437ae9SMateusz Piotrowski	__name="$(atf_get ident)"
84e7437ae9SMateusz Piotrowski	__pidfile="$(mktemp -t "${__name}.pid")"
85e7437ae9SMateusz Piotrowski	__script=$(mktemp -t "${__name}.script")
86e7437ae9SMateusz Piotrowski
87e7437ae9SMateusz Piotrowski	cat >> "$__script" <<-'LITERAL'
88e7437ae9SMateusz Piotrowski	. /etc/rc.subr
89e7437ae9SMateusz Piotrowski	name="$1"
90e7437ae9SMateusz Piotrowski	pidfile="$2"
91e7437ae9SMateusz Piotrowski	_rc_arg="$3"
92e7437ae9SMateusz Piotrowski	setvar "${name}_oomprotect" yes
93e7437ae9SMateusz Piotrowski	procname="/bin/sleep"
94e7437ae9SMateusz Piotrowski	command="/usr/sbin/daemon"
95e7437ae9SMateusz Piotrowski	command_args="-p $pidfile -- $procname 5"
96e7437ae9SMateusz Piotrowski	run_rc_command "$_rc_arg"
97e7437ae9SMateusz Piotrowski	LITERAL
98e7437ae9SMateusz Piotrowski
99e7437ae9SMateusz Piotrowski	atf_check -s exit:0 -o inline:"Starting ${__name}.\n" -e empty \
100e7437ae9SMateusz Piotrowski		/bin/sh "$__script" "$__name" "$__pidfile" onestart
101e7437ae9SMateusz Piotrowski	atf_check -s exit:0 -o match:'^..1..... .......0$' -e empty \
102e7437ae9SMateusz Piotrowski		ps -p "$(cat "$__pidfile")" -ax -o flags,flags2
103e7437ae9SMateusz Piotrowski	atf_check -s exit:0 -o ignore -e empty \
104e7437ae9SMateusz Piotrowski		/bin/sh "$__script" "$__name" "$__pidfile" onestop
105e7437ae9SMateusz Piotrowski}
106e7437ae9SMateusz Piotrowski
107e7437ae9SMateusz Piotrowskiatf_init_test_cases()
108e7437ae9SMateusz Piotrowski{
109e7437ae9SMateusz Piotrowski	atf_add_test_case oomprotect_all
110e7437ae9SMateusz Piotrowski	atf_add_test_case oomprotect_yes
111e7437ae9SMateusz Piotrowski}
112