You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
104 lines
3.1 KiB
104 lines
3.1 KiB
#!/bin/sh |
|
|
|
# allocfail.sh -- Test for libbacktrace library. |
|
# Copyright (C) 2018-2021 Free Software Foundation, Inc. |
|
|
|
# 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. |
|
|
|
# (3) The name of the author may not be used to |
|
# endorse or promote products derived from this software without |
|
# specific prior written permission. |
|
|
|
# THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``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 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. |
|
|
|
set -e |
|
|
|
if [ ! -f ./allocfail ]; then |
|
# Hard failure. |
|
exit 99 |
|
fi |
|
|
|
allocs=$(./allocfail 2>&1) |
|
if [ "$allocs" = "" ]; then |
|
# Hard failure. |
|
exit 99 |
|
fi |
|
|
|
# This generates the following output: |
|
# ... |
|
# $ allocfail.sh |
|
# allocs: 80495 |
|
# Status changed to 0 at 1 |
|
# Status changed to 1 at 3 |
|
# Status changed to 0 at 11 |
|
# Status changed to 1 at 12 |
|
# Status changed to 0 at 845 |
|
# ... |
|
# |
|
# We have status 0 for an allocation failure at: |
|
# - 1 because backtrace_create_state handles failure robustly |
|
# - 2 because the fail switches backtrace_full to !can_alloc mode. |
|
# - 11 because failure of elf_open_debugfile_by_buildid does not generate an |
|
# error callback beyond the one for the allocation failure itself. |
|
|
|
echo "allocs: $allocs" |
|
|
|
step=1 |
|
i=1 |
|
passes=0 |
|
prev_status=-1 |
|
while [ $i -le $allocs ]; do |
|
if ./allocfail $i >/dev/null 2>&1; status=$?; then |
|
true |
|
fi |
|
if [ $status -gt 1 ]; then |
|
echo "Unallowed fail found: $i" |
|
# Failure. |
|
exit 1 |
|
fi |
|
|
|
# The test-case would run too long if we would excercise all allocs. |
|
# So, run with step 1 initially, and increase the step once we have 10 |
|
# subsequent passes, and drop back to step 1 once we encounter another |
|
# failure. This takes ~2.6 seconds on an i7-6600U CPU @ 2.60GHz. |
|
if [ $status -eq 0 ]; then |
|
passes=$(($passes + 1)) |
|
if [ $passes -ge 10 ]; then |
|
step=$((step * 10)) |
|
passes=0 |
|
fi |
|
elif [ $status -eq 1 ]; then |
|
passes=0 |
|
step=1 |
|
fi |
|
|
|
if [ $status -ne $prev_status ]; then |
|
echo "Status changed to $status at $i" |
|
fi |
|
prev_status=$status |
|
|
|
i=$(($i + $step)) |
|
done |
|
|
|
# Success. |
|
exit 0
|
|
|