1*3117ece4Schristos#! /bin/sh 2*3117ece4Schristos# Make sure all these programs work properly 3*3117ece4Schristos# when invoked with --help or --version. 4*3117ece4Schristos 5*3117ece4Schristos# Copyright (C) 2000-2016 Free Software Foundation, Inc. 6*3117ece4Schristos 7*3117ece4Schristos# This program is free software: you can redistribute it and/or modify 8*3117ece4Schristos# it under the terms of the GNU General Public License as published by 9*3117ece4Schristos# the Free Software Foundation, either version 3 of the License, or 10*3117ece4Schristos# (at your option) any later version. 11*3117ece4Schristos 12*3117ece4Schristos# This program is distributed in the hope that it will be useful, 13*3117ece4Schristos# but WITHOUT ANY WARRANTY; without even the implied warranty of 14*3117ece4Schristos# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 15*3117ece4Schristos# GNU General Public License for more details. 16*3117ece4Schristos 17*3117ece4Schristos# You should have received a copy of the GNU General Public License 18*3117ece4Schristos# along with this program. If not, see <https://www.gnu.org/licenses/>. 19*3117ece4Schristos 20*3117ece4Schristos# Ensure that $SHELL is set to *some* value and exported. 21*3117ece4Schristos# This is required for dircolors, which would fail e.g., when 22*3117ece4Schristos# invoked via debuild (which removes SHELL from the environment). 23*3117ece4Schristostest "x$SHELL" = x && SHELL=/bin/sh 24*3117ece4Schristosexport SHELL 25*3117ece4Schristos 26*3117ece4Schristos. "${srcdir=.}/init.sh"; path_prepend_ . 27*3117ece4Schristos 28*3117ece4Schristosexpected_failure_status_chroot=125 29*3117ece4Schristosexpected_failure_status_env=125 30*3117ece4Schristosexpected_failure_status_nice=125 31*3117ece4Schristosexpected_failure_status_nohup=125 32*3117ece4Schristosexpected_failure_status_stdbuf=125 33*3117ece4Schristosexpected_failure_status_su=125 34*3117ece4Schristosexpected_failure_status_timeout=125 35*3117ece4Schristosexpected_failure_status_printenv=2 36*3117ece4Schristosexpected_failure_status_tty=3 37*3117ece4Schristosexpected_failure_status_sort=2 38*3117ece4Schristosexpected_failure_status_expr=3 39*3117ece4Schristosexpected_failure_status_lbracket=2 40*3117ece4Schristosexpected_failure_status_dir=2 41*3117ece4Schristosexpected_failure_status_ls=2 42*3117ece4Schristosexpected_failure_status_vdir=2 43*3117ece4Schristos 44*3117ece4Schristosexpected_failure_status_cmp=2 45*3117ece4Schristosexpected_failure_status_zcmp=2 46*3117ece4Schristosexpected_failure_status_sdiff=2 47*3117ece4Schristosexpected_failure_status_diff3=2 48*3117ece4Schristosexpected_failure_status_diff=2 49*3117ece4Schristosexpected_failure_status_zdiff=2 50*3117ece4Schristosexpected_failure_status_zgrep=2 51*3117ece4Schristosexpected_failure_status_zegrep=2 52*3117ece4Schristosexpected_failure_status_zfgrep=2 53*3117ece4Schristos 54*3117ece4Schristosexpected_failure_status_grep=2 55*3117ece4Schristosexpected_failure_status_egrep=2 56*3117ece4Schristosexpected_failure_status_fgrep=2 57*3117ece4Schristos 58*3117ece4Schristostest "$built_programs" \ 59*3117ece4Schristos || fail_ "built_programs not specified!?!" 60*3117ece4Schristos 61*3117ece4Schristostest "$VERSION" \ 62*3117ece4Schristos || fail_ "set envvar VERSION; it is required for a PATH sanity-check" 63*3117ece4Schristos 64*3117ece4Schristos# Extract version from --version output of the first program 65*3117ece4Schristosfor i in $built_programs; do 66*3117ece4Schristos v=$(env $i --version | sed -n '1s/.* //p;q') 67*3117ece4Schristos break 68*3117ece4Schristosdone 69*3117ece4Schristos 70*3117ece4Schristos# Ensure that it matches $VERSION. 71*3117ece4Schristostest "x$v" = "x$VERSION" \ 72*3117ece4Schristos || fail_ "--version-\$VERSION mismatch" 73*3117ece4Schristos 74*3117ece4Schristosfor lang in C fr da; do 75*3117ece4Schristos for i in $built_programs; do 76*3117ece4Schristos 77*3117ece4Schristos # Skip `test'; it doesn't accept --help or --version. 78*3117ece4Schristos test $i = test && continue; 79*3117ece4Schristos 80*3117ece4Schristos # false fails even when invoked with --help or --version. 81*3117ece4Schristos if test $i = false; then 82*3117ece4Schristos env LC_MESSAGES=$lang $i --help >/dev/null && fail=1 83*3117ece4Schristos env LC_MESSAGES=$lang $i --version >/dev/null && fail=1 84*3117ece4Schristos continue 85*3117ece4Schristos fi 86*3117ece4Schristos 87*3117ece4Schristos args= 88*3117ece4Schristos 89*3117ece4Schristos # The just-built install executable is always named `ginstall'. 90*3117ece4Schristos test $i = install && i=ginstall 91*3117ece4Schristos 92*3117ece4Schristos # Make sure they exit successfully, under normal conditions. 93*3117ece4Schristos eval "env \$i $args --help > h-\$i " || fail=1 94*3117ece4Schristos eval "env \$i $args --version >/dev/null" || fail=1 95*3117ece4Schristos 96*3117ece4Schristos # Make sure they mention the bug-reporting address in --help output. 97*3117ece4Schristos grep "$PACKAGE_BUGREPORT" h-$i > /dev/null || fail=1 98*3117ece4Schristos rm -f h-$i 99*3117ece4Schristos 100*3117ece4Schristos # Make sure they fail upon `disk full' error. 101*3117ece4Schristos if test -w /dev/full && test -c /dev/full; then 102*3117ece4Schristos eval "env \$i $args --help >/dev/full 2>/dev/null" && fail=1 103*3117ece4Schristos eval "env \$i $args --version >/dev/full 2>/dev/null" && fail=1 104*3117ece4Schristos status=$? 105*3117ece4Schristos test $i = [ && prog=lbracket || prog=$i 106*3117ece4Schristos eval "expected=\$expected_failure_status_$prog" 107*3117ece4Schristos test x$expected = x && expected=1 108*3117ece4Schristos if test $status = $expected; then 109*3117ece4Schristos : # ok 110*3117ece4Schristos else 111*3117ece4Schristos fail=1 112*3117ece4Schristos echo "*** $i: bad exit status \`$status' (expected $expected)," 1>&2 113*3117ece4Schristos echo " with --help or --version output redirected to /dev/full" 1>&2 114*3117ece4Schristos fi 115*3117ece4Schristos fi 116*3117ece4Schristos done 117*3117ece4Schristosdone 118*3117ece4Schristos 119*3117ece4SchristosbigZ_in=bigZ-in.Z 120*3117ece4Schristoszin=zin.gz 121*3117ece4Schristoszin2=zin2.gz 122*3117ece4Schristos 123*3117ece4Schristostmp=tmp-$$ 124*3117ece4Schristostmp_in=in-$$ 125*3117ece4Schristostmp_in2=in2-$$ 126*3117ece4Schristostmp_dir=dir-$$ 127*3117ece4Schristostmp_out=out-$$ 128*3117ece4Schristosmkdir $tmp || fail=1 129*3117ece4Schristoscd $tmp || fail=1 130*3117ece4Schristos 131*3117ece4Schristoscomm_setup () { args="$tmp_in $tmp_in"; } 132*3117ece4Schristoscsplit_setup () { args="$tmp_in //"; } 133*3117ece4Schristoscut_setup () { args='-f 1'; } 134*3117ece4Schristosjoin_setup () { args="$tmp_in $tmp_in"; } 135*3117ece4Schristostr_setup () { args='a a'; } 136*3117ece4Schristos 137*3117ece4Schristoschmod_setup () { args="a+x $tmp_in"; } 138*3117ece4Schristos# Punt on these. 139*3117ece4Schristoschgrp_setup () { args=--version; } 140*3117ece4Schristoschown_setup () { args=--version; } 141*3117ece4Schristosmkfifo_setup () { args=--version; } 142*3117ece4Schristosmknod_setup () { args=--version; } 143*3117ece4Schristos# Punt on uptime, since it fails (e.g., failing to get boot time) 144*3117ece4Schristos# on some systems, and we shouldn't let that stop `make check'. 145*3117ece4Schristosuptime_setup () { args=--version; } 146*3117ece4Schristos 147*3117ece4Schristos# Create a file in the current directory, not in $TMPDIR. 148*3117ece4Schristosmktemp_setup () { args=mktemp.XXXX; } 149*3117ece4Schristos 150*3117ece4Schristoscmp_setup () { args="$tmp_in $tmp_in2"; } 151*3117ece4Schristos 152*3117ece4Schristos# Tell dd not to print the line with transfer rate and total. 153*3117ece4Schristos# The transfer rate would vary between runs. 154*3117ece4Schristosdd_setup () { args=status=noxfer; } 155*3117ece4Schristos 156*3117ece4Schristoszdiff_setup () { args="$args $zin $zin2"; } 157*3117ece4Schristoszcmp_setup () { zdiff_setup; } 158*3117ece4Schristoszcat_setup () { args="$args $zin"; } 159*3117ece4Schristosgunzip_setup () { zcat_setup; } 160*3117ece4Schristoszmore_setup () { zcat_setup; } 161*3117ece4Schristoszless_setup () { zcat_setup; } 162*3117ece4Schristosznew_setup () { args="$args $bigZ_in"; } 163*3117ece4Schristoszforce_setup () { zcat_setup; } 164*3117ece4Schristoszgrep_setup () { args="$args z $zin"; } 165*3117ece4Schristoszegrep_setup () { zgrep_setup; } 166*3117ece4Schristoszfgrep_setup () { zgrep_setup; } 167*3117ece4Schristosgzexe_setup () { args="$args $tmp_in"; } 168*3117ece4Schristos 169*3117ece4Schristos# We know that $tmp_in contains a "0" 170*3117ece4Schristosgrep_setup () { args="0 $tmp_in"; } 171*3117ece4Schristosegrep_setup () { args="0 $tmp_in"; } 172*3117ece4Schristosfgrep_setup () { args="0 $tmp_in"; } 173*3117ece4Schristos 174*3117ece4Schristosdiff_setup () { args="$tmp_in $tmp_in2"; } 175*3117ece4Schristossdiff_setup () { args="$tmp_in $tmp_in2"; } 176*3117ece4Schristosdiff3_setup () { args="$tmp_in $tmp_in2 $tmp_in2"; } 177*3117ece4Schristoscp_setup () { args="$tmp_in $tmp_in2"; } 178*3117ece4Schristosln_setup () { args="$tmp_in ln-target"; } 179*3117ece4Schristosginstall_setup () { args="$tmp_in $tmp_in2"; } 180*3117ece4Schristosmv_setup () { args="$tmp_in $tmp_in2"; } 181*3117ece4Schristosmkdir_setup () { args=$tmp_dir/subdir; } 182*3117ece4Schristosrmdir_setup () { args=$tmp_dir; } 183*3117ece4Schristosrm_setup () { args=$tmp_in; } 184*3117ece4Schristosshred_setup () { args=$tmp_in; } 185*3117ece4Schristostouch_setup () { args=$tmp_in2; } 186*3117ece4Schristostruncate_setup () { args="--reference=$tmp_in $tmp_in2"; } 187*3117ece4Schristos 188*3117ece4Schristosbasename_setup () { args=$tmp_in; } 189*3117ece4Schristosdirname_setup () { args=$tmp_in; } 190*3117ece4Schristosexpr_setup () { args=foo; } 191*3117ece4Schristos 192*3117ece4Schristos# Punt, in case GNU `id' hasn't been installed yet. 193*3117ece4Schristosgroups_setup () { args=--version; } 194*3117ece4Schristos 195*3117ece4Schristospathchk_setup () { args=$tmp_in; } 196*3117ece4Schristosyes_setup () { args=--version; } 197*3117ece4Schristoslogname_setup () { args=--version; } 198*3117ece4Schristosnohup_setup () { args=--version; } 199*3117ece4Schristosprintf_setup () { args=foo; } 200*3117ece4Schristosseq_setup () { args=10; } 201*3117ece4Schristossleep_setup () { args=0; } 202*3117ece4Schristossu_setup () { args=--version; } 203*3117ece4Schristosstdbuf_setup () { args="-oL true"; } 204*3117ece4Schristostimeout_setup () { args=--version; } 205*3117ece4Schristos 206*3117ece4Schristos# I'd rather not run sync, since it spins up disks that I've 207*3117ece4Schristos# deliberately caused to spin down (but not unmounted). 208*3117ece4Schristossync_setup () { args=--version; } 209*3117ece4Schristos 210*3117ece4Schristostest_setup () { args=foo; } 211*3117ece4Schristos 212*3117ece4Schristos# This is necessary in the unusual event that there is 213*3117ece4Schristos# no valid entry in /etc/mtab. 214*3117ece4Schristosdf_setup () { args=/; } 215*3117ece4Schristos 216*3117ece4Schristos# This is necessary in the unusual event that getpwuid (getuid ()) fails. 217*3117ece4Schristosid_setup () { args=-u; } 218*3117ece4Schristos 219*3117ece4Schristos# Use env to avoid invoking built-in sleep of Solaris 11's /bin/sh. 220*3117ece4Schristoskill_setup () { 221*3117ece4Schristos env sleep 10m & 222*3117ece4Schristos args=$! 223*3117ece4Schristos} 224*3117ece4Schristos 225*3117ece4Schristoslink_setup () { args="$tmp_in link-target"; } 226*3117ece4Schristosunlink_setup () { args=$tmp_in; } 227*3117ece4Schristos 228*3117ece4Schristosreadlink_setup () { 229*3117ece4Schristos ln -s . slink 230*3117ece4Schristos args=slink; 231*3117ece4Schristos} 232*3117ece4Schristos 233*3117ece4Schristosstat_setup () { args=$tmp_in; } 234*3117ece4Schristosunlink_setup () { args=$tmp_in; } 235*3117ece4Schristoslbracket_setup () { args=": ]"; } 236*3117ece4Schristos 237*3117ece4Schristos# Ensure that each program "works" (exits successfully) when doing 238*3117ece4Schristos# something more than --help or --version. 239*3117ece4Schristosfor i in $built_programs; do 240*3117ece4Schristos # Skip these. 241*3117ece4Schristos case $i in chroot|stty|tty|false|chcon|runcon) continue;; esac 242*3117ece4Schristos 243*3117ece4Schristos rm -rf $tmp_in $tmp_in2 $tmp_dir $tmp_out $bigZ_in $zin $zin2 244*3117ece4Schristos echo z |gzip > $zin 245*3117ece4Schristos cp $zin $zin2 246*3117ece4Schristos cp $zin $bigZ_in 247*3117ece4Schristos 248*3117ece4Schristos # This is sort of kludgey: use numbers so this is valid input for factor, 249*3117ece4Schristos # and two tokens so it's valid input for tsort. 250*3117ece4Schristos echo 2147483647 0 > $tmp_in 251*3117ece4Schristos # Make $tmp_in2 identical. Then, using $tmp_in and $tmp_in2 as arguments 252*3117ece4Schristos # to the likes of cmp and diff makes them exit successfully. 253*3117ece4Schristos cp $tmp_in $tmp_in2 254*3117ece4Schristos mkdir $tmp_dir 255*3117ece4Schristos # echo ================== $i 256*3117ece4Schristos test $i = [ && prog=lbracket || prog=$i 257*3117ece4Schristos args= 258*3117ece4Schristos if type ${prog}_setup > /dev/null 2>&1; then 259*3117ece4Schristos ${prog}_setup 260*3117ece4Schristos fi 261*3117ece4Schristos if eval "env \$i $args < \$tmp_in > \$tmp_out"; then 262*3117ece4Schristos : # ok 263*3117ece4Schristos else 264*3117ece4Schristos echo FAIL: $i 265*3117ece4Schristos fail=1 266*3117ece4Schristos fi 267*3117ece4Schristos rm -rf $tmp_in $tmp_in2 $tmp_out $tmp_dir 268*3117ece4Schristosdone 269*3117ece4Schristos 270*3117ece4SchristosExit $fail 271