From c02dde77680c8e5ea758dc11b0d164af76d996ca Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?P=C3=A1draig=20Brady?= Date: Thu, 15 Oct 2015 10:22:20 +0100 Subject: [PATCH] tests: avoid false failure in rm/r-root.sh with gdb warnings * tests/rm/r-root.sh: SKip the test if there are gdb warnings that will impact further stderr checks. For example some buggy gdb versions may report "Got object file from memory but can't read symbols: File truncated". Also fix an incorrect stderr check from the previous change. Reported by Bernhard Voelker. --- tests/rm/r-root.sh | 55 +++++++++++++++++++++++++++--------------------------- 1 file changed, 28 insertions(+), 27 deletions(-) diff --git a/tests/rm/r-root.sh b/tests/rm/r-root.sh index e0564b8..6754c10 100755 --- a/tests/rm/r-root.sh +++ b/tests/rm/r-root.sh @@ -89,6 +89,19 @@ def breakpoint_handler (event): gdb.events.stop.connect(breakpoint_handler) EOF.py +# In order of the sed expressions below, this cleans: +# +# 1. gdb uses the full path when running rm, so remove the leading dirs. +# 2. For some of the "/" synonyms, the error diagnostic slightly differs from +# that of the basic "/" case (see gnulib's fts_open' and ROOT_DEV_INO_WARN): +# rm: it is dangerous to operate recursively on 'FILE' (same as '/') +# Strip that part off for the following comparison. +clean_rm_err_() +{ + sed "s/.*rm: /rm: /; \ + s/\(rm: it is dangerous to operate recursively on\).*$/\1 '\/'/" +} + #------------------------------------------------------------------------------- # exercise_rm_r_root: shell function to test "rm -r '/'" # The caller must provide the FILE to remove as well as any options @@ -121,9 +134,13 @@ exercise_rm_r_root () --eval-command='source bp.py' \ --eval-command="run -rv --one-file-system $*" \ --eval-command='quit' \ - rm < /dev/null > out 2> err + rm < /dev/null > out 2> err.t - return $? + ret=$? + + clean_rm_err_ < err.t > err || framework_failure_ + + return $ret } # Verify that "rm -r dir" basically works. @@ -143,6 +160,7 @@ for file in dir file ; do test -e "$file" || skip=1 test -f x || skip=1 test -f excise.break || skip=1 # gdb works and breakpoint hit + compare /dev/null err || skip=1 test "$skip" = 1 \ && { cat out; cat err; \ @@ -156,19 +174,6 @@ rm: it is dangerous to operate recursively on '/' rm: use --no-preserve-root to override this failsafe EOD -# In order of the sed expressions below, this cleans: -# -# 1. gdb uses the full path when running rm, so remove the leading dirs. -# 2. For some of the "/" synonyms, the error diagnostic slightly differs from -# that of the basic "/" case (see gnulib's fts_open' and ROOT_DEV_INO_WARN): -# rm: it is dangerous to operate recursively on 'FILE' (same as '/') -# Strip that part off for the following comparison. -clean_rm_err() -{ - sed "s/.*rm: /rm: /; \ - s/\(rm: it is dangerous to operate recursively on\).*$/\1 '\/'/" -} - #------------------------------------------------------------------------------- # Exercise "rm -r /" without and with the --preserve-root option. # Exercise various synonyms of "/" including symlinks to it. @@ -190,14 +195,12 @@ for opts in \ returns_ 1 exercise_rm_r_root $opts || fail=1 - clean_rm_err < err > err2 || framework_failure_ - - # Expect nothing in 'out' and the above error diagnostic in 'err2'. + # Expect nothing in 'out' and the above error diagnostic in 'err'. # As rm(1) should have skipped the "/" argument, it does not call unlinkat(). # Therefore, the evidence file "x" should not exist. - compare /dev/null out || fail=1 - compare exp err2 || fail=1 - test -f x && fail=1 + compare /dev/null out || fail=1 + compare exp err || fail=1 + test -f x && fail=1 # Do nothing more if this test failed. test $fail = 1 && { cat out; cat err; Exit $fail; } @@ -219,8 +222,6 @@ CU_TEST_SKIP_EXIT=1 returns_ 1 exercise_rm_r_root --preserve-root file1 '/' file2 || fail=1 -clean_rm_err < err > err2 || framework_failure_ - unset CU_TEST_SKIP_EXIT cat < out_removed @@ -232,9 +233,9 @@ EOD # Both 'file1' and 'file2' should be removed. Simply verify that in the # "out" file, as the replacement unlinkat() dummy did not remove them. # Expect the evidence file "x" to exist. -compare out_removed out || fail=1 -compare exp err2 || fail=1 -test -f x || fail=1 +compare out_removed out || fail=1 +compare exp err || fail=1 +test -f x || fail=1 # Do nothing more if this test failed. test $fail = 1 && { cat out; cat err; Exit $fail; } @@ -283,7 +284,7 @@ exercise_rm_r_root --interactive=never --no-preserve-root '/' \ || fail=1 # The 'err' file should not contain the above error diagnostic. -grep "^rm: it is dangerous to operate recursively on '/'" err && fail=1 +grep "rm: it is dangerous to operate recursively on '/'" err && fail=1 # Instead, rm(1) should have called the intercepted unlinkat() function, # i.e., the evidence file "x" should exist. -- 2.5.0