diff --git a/etc/mtree/BSD.tests.dist b/etc/mtree/BSD.tests.dist --- a/etc/mtree/BSD.tests.dist +++ b/etc/mtree/BSD.tests.dist @@ -860,6 +860,8 @@ .. posixshm .. + racct + .. sys .. vfs diff --git a/tests/sys/Makefile b/tests/sys/Makefile --- a/tests/sys/Makefile +++ b/tests/sys/Makefile @@ -28,6 +28,7 @@ TESTS_SUBDIRS+= netpfil TESTS_SUBDIRS+= opencrypto TESTS_SUBDIRS+= posixshm +TESTS_SUBDIRS+= racct TESTS_SUBDIRS+= sys TESTS_SUBDIRS+= vfs TESTS_SUBDIRS+= vm diff --git a/tests/sys/racct/Makefile b/tests/sys/racct/Makefile new file mode 100644 --- /dev/null +++ b/tests/sys/racct/Makefile @@ -0,0 +1,16 @@ +PACKAGE= tests + +TESTSDIR= ${TESTSBASE}/sys/racct + +BINDIR= ${TESTSDIR} + +ATF_TESTS_SH+= racct_jail_shm \ + racct_jail_cpu \ + racct_jail_proc + +PROGS+= loop \ + manyforks + +${PACKAGE}FILES+= utils.subr + +.include diff --git a/tests/sys/racct/loop.c b/tests/sys/racct/loop.c new file mode 100644 --- /dev/null +++ b/tests/sys/racct/loop.c @@ -0,0 +1,43 @@ +/*- + * SPDX-License-Identifier: BSD-2-Clause-FreeBSD + * + * Copyright (c) 2021 The FreeBSD Foundation + * + * This software was developed by Cyril Zhang under sponsorship from + * the FreeBSD Foundation. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#include +#include + +int +main() +{ + struct timeval zero = { 0, 0 }; + struct timeval three = { 3, 0 }; + struct itimerval timer = { zero, three }; + setitimer(ITIMER_REAL, &timer, NULL); + for (;;) + system("true"); +} diff --git a/tests/sys/racct/manyforks.c b/tests/sys/racct/manyforks.c new file mode 100644 --- /dev/null +++ b/tests/sys/racct/manyforks.c @@ -0,0 +1,61 @@ +/*- + * SPDX-License-Identifier: BSD-2-Clause-FreeBSD + * + * Copyright (c) 2021 The FreeBSD Foundation + * + * This software was developed by Cyril Zhang under sponsorship from + * the FreeBSD Foundation. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#include +#include + +static void +fork_and_handle(int fail) +{ + pid_t pid = fork(); + if (pid == 0) { + usleep(2000000); + exit(0); + } + else if (fail) { + exit(!(pid == -1)); + } + else if (pid == -1) { + exit(1); + } +} + +int +main() +{ + /* + * Fork 5 times successfully, + * 1 time unsuccessfully. + */ + for (int i = 0; i < 5; ++i) { + fork_and_handle(0); + } + fork_and_handle(1); +} diff --git a/tests/sys/racct/racct_jail_cpu.sh b/tests/sys/racct/racct_jail_cpu.sh new file mode 100644 --- /dev/null +++ b/tests/sys/racct/racct_jail_cpu.sh @@ -0,0 +1,66 @@ +#- +# SPDX-License-Identifier: BSD-2-Clause-FreeBSD +# +# Copyright (c) 2021 The FreeBSD Foundation +# +# This software was developed by Cyril Zhang under sponsorship from +# the FreeBSD Foundation. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are +# met: +# 1. Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# 2. Redistributions in binary form must reproduce the above copyright +# notice, this list of conditions and the following disclaimer in +# the documentation and/or other materials provided with the distribution. +# +# THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND +# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +# ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE +# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS +# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY +# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF +# SUCH DAMAGE. +# + +. $(atf_get_srcdir)/utils.subr + +atf_test_case racct_cpu cleanup +racct_cpu_head() +{ + atf_set "descr" "Tests pcpu and cputime for a jail racct." + atf_set "require.user" "root" +} +racct_cpu_body() +{ + # This test checks pctcpu and cputime at once, + # in order to avoid running the 3s loop twice. + racct_mkjail myjail + jexec myjail $(atf_get_srcdir)/loop & + sleep 2 + pcpu=$(rctl -u jail:myjail | grep "pcpu" | sed 's/.*=//') + sleep 2 + cputime=$(rctl -u jail:myjail | grep "cputime" | sed 's/.*=//') + # We'll give a very large tolerance for pcpu, + # due to the decay factor involved in its calculation. + # cputime may be rounded down to 2 but should + # not exceed 3. + if [ $cputime -lt 2 ] || [ $cputime -gt 3 ] || [ $pcpu -lt 60 ] || [ $pcpu -gt 140 ]; then + atf_fail "expected pcpu: ~100, actual: $pcpu | expected cputime: ~3, actual: $cputime" + fi + +} +racct_cpu_cleanup() +{ + racct_cleanup +} + +atf_init_test_cases() +{ + atf_add_test_case racct_cpu +} diff --git a/tests/sys/racct/racct_jail_proc.sh b/tests/sys/racct/racct_jail_proc.sh new file mode 100644 --- /dev/null +++ b/tests/sys/racct/racct_jail_proc.sh @@ -0,0 +1,55 @@ +#- +# SPDX-License-Identifier: BSD-2-Clause-FreeBSD +# +# Copyright (c) 2021 The FreeBSD Foundation +# +# This software was developed by Cyril Zhang under sponsorship from +# the FreeBSD Foundation. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are +# met: +# 1. Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# 2. Redistributions in binary form must reproduce the above copyright +# notice, this list of conditions and the following disclaimer in +# the documentation and/or other materials provided with the distribution. +# +# THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND +# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +# ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE +# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS +# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY +# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF +# SUCH DAMAGE. +# + +. $(atf_get_srcdir)/utils.subr + +atf_test_case racct_max_proc cleanup +racct_max_proc_head() +{ + atf_set "descr" "Tests maxproc for a jail racct." + atf_set "require.user" "root" +} +racct_max_proc_body() +{ + racct_mkjail myjail + rctl -a "jail:myjail:maxproc:deny=5" + + atf_check -s exit:0 "$(atf_get_srcdir)/manyforks" +} +racct_max_proc_cleanup() +{ + rctl -r "jail:myjail:maxproc:deny=5" + racct_cleanup +} + +atf_init_test_cases() +{ + atf_add_test_case racct_max_proc +} diff --git a/tests/sys/racct/racct_jail_shm.sh b/tests/sys/racct/racct_jail_shm.sh new file mode 100644 --- /dev/null +++ b/tests/sys/racct/racct_jail_shm.sh @@ -0,0 +1,158 @@ +#- +# SPDX-License-Identifier: BSD-2-Clause-FreeBSD +# +# Copyright (c) 2021 The FreeBSD Foundation +# +# This software was developed by Cyril Zhang under sponsorship from +# the FreeBSD Foundation. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are +# met: +# 1. Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# 2. Redistributions in binary form must reproduce the above copyright +# notice, this list of conditions and the following disclaimer in +# the documentation and/or other materials provided with the distribution. +# +# THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND +# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +# ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE +# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS +# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY +# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF +# SUCH DAMAGE. +# + +. $(atf_get_srcdir)/utils.subr + +atf_test_case racct_shm_count cleanup +racct_shm_count_head() +{ + atf_set "descr" "Tests nshm for a jail racct." + atf_set "require.user" "root" +} +racct_shm_count_body() +{ + racct_mkjail myjail + rctl -a "jail:myjail:nshm:deny=20" + + racct_make_objects myjail 20 + racct_make_forbidden_object myjail 21 + racct_remove_objects myjail 20 + racct_make_objects myjail 20 + racct_make_forbidden_object myjail 21 +} +racct_shm_count_cleanup() +{ + rctl -r "jail:myjail:nshm:deny=20" + # This is due to a bug in posix shared memory objects, and + # is subject for removal. + # Removing the shared memory objects should not be necessary. + racct_remove_objects myjail 21 + racct_cleanup +} + +atf_test_case racct_shm_size cleanup +racct_shm_size_head() +{ + atf_set "descr" "Tests shmsize for a jail racct." + atf_set "require.user" "root" +} +racct_shm_size_body() +{ + racct_mkjail myjail + rctl -a "jail:myjail:shmsize:deny=10000" + + racct_make_objects myjail 20 + racct_truncate_objects myjail 19 512 + racct_truncate_forbidden_object myjail 20 512 + racct_truncate_objects myjail 19 0 + racct_truncate_objects myjail 19 512 + racct_truncate_forbidden_object myjail 20 512 +} +racct_shm_size_cleanup() +{ + rctl -r "jail:myjail:shmsize:deny=10000" + # This is due to a bug in posix shared memory objects, and + # is subject for removal. + # Removing the shared memory objects should not be necessary. + racct_remove_objects myjail 20 + racct_cleanup +} + +racct_mkjail() +{ + jailname=$1 + jail -c name=${jailname} persist + echo $jailname >> created_jails.lst +} +racct_cleanup() +{ + if [ -f created_jails.lst ] + then + for jailname in `cat created_jails.lst` + do + jail -r ${jailname} + done + rm created_jails.lst + fi +} + +racct_make_objects() +{ + local jailname max + jailname=$1 + max=$2 + for i in $(seq 1 $max); do + atf_check -s exit:0 jexec "$jailname" posixshmcontrol create "/$jailname$i" + done +} + +racct_make_forbidden_object() +{ + local jailname i + jailname=$1 + i=$2 + atf_check -s exit:1 -e ignore jexec "$jailname" posixshmcontrol create "/$jailname$i" +} + +racct_truncate_objects() +{ + local jailname max size + jailname=$1 + max=$2 + size=$3 + for i in $(seq 1 $max); do + atf_check -s exit:0 jexec "$jailname" posixshmcontrol truncate -s "$size" "/$jailname$i" + done +} + +racct_truncate_forbidden_object() +{ + local jailname i size + jailname=$1 + i=$2 + size=$3 + atf_check -s exit:1 -e ignore jexec "$jailname" posixshmcontrol truncate -s "$size" "/$jailname$i" +} + +racct_remove_objects() +{ + local jailname max + jailname=$1 + max=$2 + for i in $(seq 1 $max); do + jexec $jailname posixshmcontrol rm "/$jailname$i" + done +} + +atf_init_test_cases() +{ + atf_add_test_case racct_shm_count + atf_add_test_case racct_shm_size +} diff --git a/tests/sys/racct/utils.subr b/tests/sys/racct/utils.subr new file mode 100644 --- /dev/null +++ b/tests/sys/racct/utils.subr @@ -0,0 +1,47 @@ +#- +# SPDX-License-Identifier: BSD-2-Clause-FreeBSD +# +# Copyright (c) 2021 The FreeBSD Foundation +# +# This software was developed by Cyril Zhang under sponsorship from +# the FreeBSD Foundation. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are +# met: +# 1. Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# 2. Redistributions in binary form must reproduce the above copyright +# notice, this list of conditions and the following disclaimer in +# the documentation and/or other materials provided with the distribution. +# +# THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND +# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +# ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE +# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS +# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY +# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF +# SUCH DAMAGE. +# + +racct_mkjail() +{ + jailname=$1 + jail -c name=${jailname} persist + echo $jailname >> created_jails.lst +} +racct_cleanup() +{ + if [ -f created_jails.lst ] + then + for jailname in `cat created_jails.lst` + do + jail -r ${jailname} + done + rm created_jails.lst + fi +}