tests: improve setarch tests, regarding --uname-2.6 issues

Add some more tests:
  * error handling "unknown arch" and "unknown command"
  * "noop" test with host arch and no other options
  * all options except --uname-2.6
  * --uname-2.6 whithout any other options but handle fatal
    glibc error "kernel too old" (with debug output)
  * add a "real" --uname-2.6 test which validates uname(1)
    output

Note the "kernel too old" cases are systems where glibc was
configured to support only kernels > 3.0. On some archs
(e.g. x86) --uname-2.6 still works with such glibc because
2.6.39 had all needed features on board (e.g. vdso).
See https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=806911

Some people reported segfaults (after execvp) but I can only
reproduce it on arm* and aarch64 qemu-user-space builds. We
don't need to fix our tests for such broken systems where
also many other tests fail currently.

Signed-off-by: Ruediger Meier <ruediger.meier@ga-group.nl>
This commit is contained in:
Ruediger Meier 2016-03-22 10:06:22 +01:00
parent 9508e2972b
commit 33bed90a7f
4 changed files with 83 additions and 8 deletions

View file

@ -1,3 +1,14 @@
###### unknown arch
setarch: qubit: Unrecognized architecture
exit: 1
###### unknown command
Execute command `/das/gibs/nicht'.
setarch: /das/gibs/nicht: No such file or directory
exit: 1
###### noop uname -a
Execute command `uname'.
uname -a unchanged
###### almost all options
Switching on ADDR_NO_RANDOMIZE.
Switching on FDPIC_FUNCPTRS.
Switching on MMAP_PAGE_ZERO.
@ -8,6 +19,5 @@ Switching on SHORT_INODE.
Switching on WHOLE_SECONDS.
Switching on STICKY_TIMEOUTS.
Switching on ADDR_LIMIT_3GB.
Switching on UNAME26.
Execute command `echo'.
success

View file

@ -0,0 +1,6 @@
###### --uname-2.6 echo
Switching on UNAME26.
Execute command `echo'.
2.6 works or kernel too old
###### --uname-2.6 true, non-verbose
2.6 works or kernel too old

View file

@ -0,0 +1 @@
kernel version changed to 2.6

View file

@ -21,13 +21,71 @@ ts_init "$*"
ts_check_test_command "$TS_CMD_SETARCH"
ARCH=$(uname -m)
case $ARCH in
# setarch --uname-2.6 fails on platforms without VDS
*sparc* )
ts_skip "unsupported arch"
;;
esac
$TS_CMD_SETARCH $(uname -m) -vRFZLXBIST3 --uname-2.6 echo "success" >$TS_OUTPUT 2>&1
ts_init_subtest options
echo "###### unknown arch" >>$TS_OUTPUT
$TS_CMD_SETARCH qubit -v echo "success" >>$TS_OUTPUT 2>&1
echo "exit: $?" >>$TS_OUTPUT
echo "###### unknown command" >>$TS_OUTPUT
$TS_CMD_SETARCH $ARCH -v /das/gibs/nicht >>$TS_OUTPUT 2>&1
echo "exit: $?" >>$TS_OUTPUT
echo "###### noop uname -a" >>$TS_OUTPUT
uname_a=$(uname -srm)
$TS_CMD_SETARCH $ARCH -v uname -srm >>$TS_OUTPUT 2>&1
sed -i "$ s@${uname_a}@uname -a unchanged@" $TS_OUTPUT
echo "###### almost all options" >>$TS_OUTPUT
$TS_CMD_SETARCH $ARCH -vRFZLXBIST3 echo "success" >>$TS_OUTPUT 2>&1
ts_finalize_subtest
ts_init_subtest uname26
finmsg="" # for debugging 2.6 issues
echo "###### --uname-2.6 echo" >>$TS_OUTPUT
$TS_CMD_SETARCH $ARCH -v --uname-2.6 echo "2.6 worked" >>$TS_OUTPUT 2>&1
if [ $? -eq 0 ]; then
expected='^2.6 worked$'
else
# this may happen after execvp
expected="^FATAL: kernel too old$"
finmsg+=" echo"
fi
sed -i "$ s/$expected/2.6 works or kernel too old/" $TS_OUTPUT
echo "###### --uname-2.6 true, non-verbose" >>$TS_OUTPUT
$TS_CMD_SETARCH $ARCH --uname-2.6 true >>$TS_OUTPUT 2>&1
if [ $? -eq 0 ]; then
echo "2.6 works or kernel too old" >> $TS_OUTPUT
else
# this may happen after execvp
expected="^FATAL: kernel too old$"
sed -i "$ s/$expected/2.6 works or kernel too old/" $TS_OUTPUT
finmsg+=" true"
fi
if [ -n "$finmsg" ]; then
finmsg=$(echo unsupported --uname-2.6: $finmsg)
else
uname26_seems_supported=yes
fi
ts_finalize_subtest "$finmsg"
# conditional subtest
if [ "$uname26_seems_supported" = "yes" ]; then
ts_init_subtest uname26-version
tmp=$($TS_CMD_SETARCH $ARCH --uname-2.6 uname -r)
if echo "$tmp" | grep -q "^2\.6\."; then
echo "kernel version changed to 2.6" >> $TS_OUTPUT
else
echo "uname26 failed" >> $TS_OUTPUT
echo "original kernel: $(uname -r)" >> $TS_OUTPUT
echo "uname26 kernel: $tmp" >> $TS_OUTPUT
fi
ts_finalize_subtest
fi # conditional subtest
ts_finalize