96 lines
3.5 KiB
Bash
Executable file
96 lines
3.5 KiB
Bash
Executable file
#!/bin/sh
|
|
# Verify that all options mentioned in usage are recognized by getopt.
|
|
|
|
# Copyright (C) 2017-2025 Free Software Foundation, Inc.
|
|
|
|
# This program is free software: you can redistribute it and/or modify
|
|
# it under the terms of the GNU General Public License as published by
|
|
# the Free Software Foundation, either version 3 of the License, or
|
|
# (at your option) any later version.
|
|
|
|
# This program is distributed in the hope that it will be useful,
|
|
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
# GNU General Public License for more details.
|
|
|
|
# You should have received a copy of the GNU General Public License
|
|
# along with this program. If not, see <https://www.gnu.org/licenses/>.
|
|
|
|
. "${srcdir=.}/tests/init.sh"; path_prepend_ ./src
|
|
|
|
checkprg () {
|
|
prg="$1"
|
|
|
|
# Get stderr output for unrecognized options for later use as a pattern.
|
|
# Also consider the expected exit status of each program.
|
|
rcexp=1
|
|
case "$prg" in
|
|
dir | ls | printenv | sort | tty | vdir ) rcexp=2 ;;
|
|
env | chroot | nice | nohup | runcon | stdbuf | timeout ) rcexp=125 ;;
|
|
esac
|
|
# Write the pattern for a long, unknown option into a pattern file.
|
|
o='thisoptiondoesnotexist'
|
|
returns_ $rcexp $prg --$o >/dev/null 2> err || fail=1
|
|
grep -F "$o" err || framework_failure_
|
|
sed -n "1s/--$o/OPT/p" < err > pat || framework_failure_
|
|
|
|
# Append the pattern for a short unknown option.
|
|
returns_ $rcexp $prg -/ >/dev/null 2> err || fail=1
|
|
grep " '*/'*" err || framework_failure_
|
|
# The following only handles the common case that has single quotes,
|
|
# as it simplifies to identify missing options only on common systems.
|
|
sed -n "1s/'\/'/'OPT'/p" < err >> pat || framework_failure_
|
|
|
|
# Get output for --help.
|
|
$prg --help > help || fail=1
|
|
|
|
# Extract all options mention in the above --help output.
|
|
nl="
|
|
"
|
|
sed -n -e '/--version/q' \
|
|
-e 's/^ \{2,6\}-/-/; s/ .*//; s/[=[].*//; s/, /\'"$nl"'/g; s/^-/-/p' help \
|
|
> opts || framework_failure_
|
|
cat opts # for debugging purposes
|
|
|
|
# Test all options mentioned in usage (but --version).
|
|
while read opt; do
|
|
test "x$opt" = 'x--help' \
|
|
&& continue
|
|
# Append --help to be on the safe side: the option under test either
|
|
# requires a further argument, or --help triggers usage(); so $prg should
|
|
# exit without performing its regular operation.
|
|
# Add a 2nd --help for the 'env -u --help' case.
|
|
$prg "$opt" --help --help </dev/null >out 2>err1
|
|
rc=$?
|
|
# In the --help case, i.e., when the option under test has been accepted,
|
|
# the exit code should be Zero.
|
|
if [ $rc = 0 ]; then
|
|
compare help out || fail=1
|
|
else
|
|
# Else $prg should have complained about a missing argument.
|
|
# Catch false positives.
|
|
case "$prg/$opt" in
|
|
'pr/-COLUMN') continue;;
|
|
esac
|
|
# Replace $opt in stderr output by the neutral placeholder.
|
|
# Handle both long and short option error messages.
|
|
sed -e "s/$opt/OPT/" -e "s/'.'/'OPT'/" < err1 > err || framework_failure_
|
|
# Fail if the stderr output matches the above provoked error.
|
|
grep -Ff pat err && { fail=1; cat err1; }
|
|
fi
|
|
done < opts
|
|
}
|
|
|
|
for prg in $built_programs; do
|
|
case "$prg" in
|
|
# Skip utilities entirely which have special option parsing.
|
|
'[' | expr | stty )
|
|
continue;;
|
|
# Wrap some utilities known by the shell by env.
|
|
echo | false | kill | printf | pwd | sleep | test | true )
|
|
prg="env $prg";;
|
|
esac
|
|
checkprg $prg
|
|
done
|
|
|
|
Exit $fail
|