opnsense-src/usr.bin/limits/tests/limits_test.sh
Mark Johnston 0599d2a1c5 limits tests: Try to fix spurious cputime test failures
I very occasionally see test failures caused by the total CPU time being
several milliseconds under 3s.  The test runs "limits -t 3 time <busy
loop>" and verifies that the reported time elapsed is at least 3s (and
not too much more).  In particular, any time spent executing time(1)
itself is counted against the limit but not recorded in the output.

I think it makes more sense to reverse the order, so that the CPU time
limit is not applied to time(1) itself.  This also resolves the test
failures I was seeing, which were reproducible only under load (i.e.,
running many tests in parallel).

MFC after:	2 weeks
Sponsored by:	Klara, Inc.

(cherry picked from commit 0f63c4af5e4761680550b0aa08cc96f52076c08c)
2025-03-07 22:51:48 +00:00

92 lines
2.7 KiB
Bash
Executable file

#
# Copyright 2015 EMC Corp.
# All rights reserved.
#
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions are
# met:
#
# * Redistributions of source code must retain the above copyright
# notice, this list of conditions and the following disclaimer.
# * 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 COPYRIGHT HOLDERS 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 COPYRIGHT
# OWNER 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.
#
#
# Make sure time(1) is consistent with the FreeBSD time command and not the
# shell interpretation of time(1)
TIME=/usr/bin/time
validate_time_output()
{
local time_output=$1
# RLIMIT_CPU is enforced by a 1-second timer. Allow 3 + 1 + a little.
atf_check awk '
/^(user|sys) / {
sum += $2
}
END {
if (sum < 3 || sum >= 4.5) {
print(sum);
exit(1);
}
}
' < $time_output
}
atf_test_case cputime_hard_flag cleanup
cputime_hard_flag_body()
{
atf_check -o match:'cputime[[:space:]]+3 secs' \
limits -H -t 3 limits -H
atf_check -o match:'cputime[[:space:]]+3 secs' \
limits -H -t 3 limits -S
atf_check -e save:time_output -s signal:sigkill \
$TIME -p limits -H -t 3 sh -c 'while : ; do : ; done'
validate_time_output time_output
}
cputime_hard_flag_cleanup()
{
rm -f time_output
}
SIGXCPU=24 # atf_check doesn't know sigxcpu
atf_test_case cputime_soft_flag cleanup
cputime_soft_flag_body()
{
atf_check -o match:'cputime-max[[:space:]]+infinity secs' \
limits -S -t 3 limits -H
atf_check -o match:'cputime-cur[[:space:]]+3 secs' \
limits -S -t 3 limits -S
atf_check -e save:time_output -s signal:$SIGXCPU \
$TIME -p limits -S -t 3 sh -c 'while : ; do : ; done'
validate_time_output time_output
}
cputime_soft_flag_cleanup()
{
rm -f time_output
}
atf_init_test_cases()
{
atf_add_test_case cputime_hard_flag
atf_add_test_case cputime_soft_flag
}