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