Skip to content

Commit

Permalink
tests/qemu-iotests: Rework the checks and spots using GNU sed
Browse files Browse the repository at this point in the history
Instead of failing the iotests if GNU sed is not available (or skipping
them completely in the check-block.sh script), it would be better to
simply skip the bash-based tests that rely on GNU sed, so that the other
tests could still be run. Thus we now explicitely use "gsed" (either as
direct program or as a wrapper around "sed" if it's the GNU version)
in the spots that rely on the GNU sed behavior. Statements that use the
"-r" parameter of sed have been switched to use "-E" instead, since this
switch is supported by all sed versions on our supported build hosts
(most also support "-r", but macOS' sed only supports "-E"). With all
these changes in place, we then can also remove the sed checks from the
check-block.sh script, so that "make check-block" can now be run on
systems without GNU sed, too.

Signed-off-by: Thomas Huth <thuth@redhat.com>
Message-Id: <20220216125454.465041-1-thuth@redhat.com>
Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
Reviewed-by: Eric Blake <eblake@redhat.com>
Signed-off-by: Kevin Wolf <kwolf@redhat.com>
  • Loading branch information
huth authored and kevmw committed Mar 4, 2022
1 parent 971bea8 commit 9086c76
Show file tree
Hide file tree
Showing 4 changed files with 57 additions and 67 deletions.
12 changes: 0 additions & 12 deletions tests/check-block.sh
Expand Up @@ -48,18 +48,6 @@ if LANG=C bash --version | grep -q 'GNU bash, version [123]' ; then
skip "bash version too old ==> Not running the qemu-iotests."
fi

if ! (sed --version | grep 'GNU sed') > /dev/null 2>&1 ; then
if ! command -v gsed >/dev/null 2>&1; then
skip "GNU sed not available ==> Not running the qemu-iotests."
fi
else
# Double-check that we're not using BusyBox' sed which says
# that "This is not GNU sed version 4.0" ...
if sed --version | grep -q 'not GNU sed' ; then
skip "BusyBox sed not supported ==> Not running the qemu-iotests."
fi
fi

cd tests/qemu-iotests

# QEMU_CHECK_BLOCK_AUTO is used to disable some unstable sub-tests
Expand Down
2 changes: 1 addition & 1 deletion tests/qemu-iotests/271
Expand Up @@ -896,7 +896,7 @@ _make_test_img -o extended_l2=on 1M
# Second and third writes in _concurrent_io() are independent and may finish in
# different order. So, filter offset out to match both possible variants.
_concurrent_io | $QEMU_IO | _filter_qemu_io | \
$SED -e 's/\(20480\|40960\)/OFFSET/'
sed -e 's/\(20480\|40960\)/OFFSET/'
_concurrent_verify | $QEMU_IO | _filter_qemu_io

# success, all done
Expand Down
65 changes: 33 additions & 32 deletions tests/qemu-iotests/common.filter
Expand Up @@ -21,66 +21,67 @@

_filter_date()
{
$SED -re 's/[0-9]{4}-[0-9]{2}-[0-9]{2} [0-9]{2}:[0-9]{2}:[0-9]{2}/yyyy-mm-dd hh:mm:ss/'
sed -Ee 's/[0-9]{4}-[0-9]{2}-[0-9]{2} [0-9]{2}:[0-9]{2}:[0-9]{2}/yyyy-mm-dd hh:mm:ss/'
}

_filter_vmstate_size()
{
$SED -r -e 's/[0-9. ]{5} [KMGT]iB/ SIZE/' \
-e 's/[0-9. ]{5} B/ SIZE/'
sed -E -e 's/[0-9. ]{5} [KMGT]iB/ SIZE/' \
-e 's/[0-9. ]{5} B/ SIZE/'
}

_filter_generated_node_ids()
{
$SED -re 's/\#block[0-9]{3,}/NODE_NAME/'
sed -Ee 's/\#block[0-9]{3,}/NODE_NAME/'
}

_filter_qom_path()
{
$SED -e '/Attached to:/s/\device[[0-9]\+\]/device[N]/g'
gsed -e '/Attached to:/s/\device[[0-9]\+\]/device[N]/g'
}

# replace occurrences of the actual TEST_DIR value with TEST_DIR
_filter_testdir()
{
$SED -e "s#$TEST_DIR/#TEST_DIR/#g" \
-e "s#$SOCK_DIR/#SOCK_DIR/#g" \
-e "s#SOCK_DIR/fuse-#TEST_DIR/#g"
sed -e "s#$TEST_DIR/#TEST_DIR/#g" \
-e "s#$SOCK_DIR/#SOCK_DIR/#g" \
-e "s#SOCK_DIR/fuse-#TEST_DIR/#g"
}

# replace occurrences of the actual IMGFMT value with IMGFMT
_filter_imgfmt()
{
$SED -e "s#$IMGFMT#IMGFMT#g"
sed -e "s#$IMGFMT#IMGFMT#g"
}

# Replace error message when the format is not supported and delete
# the output lines after the first one
_filter_qemu_img_check()
{
$SED -e '/allocated.*fragmented.*compressed clusters/d' \
gsed -e '/allocated.*fragmented.*compressed clusters/d' \
-e 's/qemu-img: This image format does not support checks/No errors were found on the image./' \
-e '/Image end offset: [0-9]\+/d'
}

# Removes \r from messages
_filter_win32()
{
$SED -e 's/\r//g'
gsed -e 's/\r//g'
}

# sanitize qemu-io output
_filter_qemu_io()
{
_filter_win32 | $SED -e "s/[0-9]* ops\; [0-9/:. sec]* ([0-9/.inf]* [EPTGMKiBbytes]*\/sec and [0-9/.inf]* ops\/sec)/X ops\; XX:XX:XX.X (XXX YYY\/sec and XXX ops\/sec)/" \
_filter_win32 | \
gsed -e "s/[0-9]* ops\; [0-9/:. sec]* ([0-9/.inf]* [EPTGMKiBbytes]*\/sec and [0-9/.inf]* ops\/sec)/X ops\; XX:XX:XX.X (XXX YYY\/sec and XXX ops\/sec)/" \
-e "s/: line [0-9][0-9]*: *[0-9][0-9]*\( Aborted\| Killed\)/:\1/" \
-e "s/qemu-io> //g"
}

# replace occurrences of QEMU_PROG with "qemu"
_filter_qemu()
{
$SED -e "s#\\(^\\|(qemu) \\)$(basename $QEMU_PROG):#\1QEMU_PROG:#" \
gsed -e "s#\\(^\\|(qemu) \\)$(basename $QEMU_PROG):#\1QEMU_PROG:#" \
-e 's#^QEMU [0-9]\+\.[0-9]\+\.[0-9]\+ monitor#QEMU X.Y.Z monitor#' \
-e $'s#\r##' # QEMU monitor uses \r\n line endings
}
Expand All @@ -89,7 +90,7 @@ _filter_qemu()
_filter_qmp()
{
_filter_win32 | \
$SED -e 's#\("\(micro\)\?seconds": \)[0-9]\+#\1 TIMESTAMP#g' \
gsed -e 's#\("\(micro\)\?seconds": \)[0-9]\+#\1 TIMESTAMP#g' \
-e 's#^{"QMP":.*}$#QMP_VERSION#' \
-e '/^ "QMP": {\s*$/, /^ }\s*$/ c\' \
-e ' QMP_VERSION'
Expand All @@ -98,32 +99,32 @@ _filter_qmp()
# readline makes HMP command strings so long that git complains
_filter_hmp()
{
$SED -e $'s/^\\((qemu) \\)\\?.*\e\\[D/\\1/g' \
gsed -e $'s/^\\((qemu) \\)\\?.*\e\\[D/\\1/g' \
-e $'s/\e\\[K//g'
}

# replace block job offset
_filter_block_job_offset()
{
$SED -e 's/, "offset": [0-9]\+,/, "offset": OFFSET,/'
sed -e 's/, "offset": [0-9]\+,/, "offset": OFFSET,/'
}

# replace block job len
_filter_block_job_len()
{
$SED -e 's/, "len": [0-9]\+,/, "len": LEN,/g'
sed -e 's/, "len": [0-9]\+,/, "len": LEN,/g'
}

# replace actual image size (depends on the host filesystem)
_filter_actual_image_size()
{
$SED -s 's/\("actual-size":\s*\)[0-9]\+/\1SIZE/g'
gsed -s 's/\("actual-size":\s*\)[0-9]\+/\1SIZE/g'
}

# Filename filters for qemu-img create
_filter_img_create_filenames()
{
$SED \
sed \
-e "s#$REMOTE_TEST_DIR#TEST_DIR#g" \
-e "s#$IMGPROTO:$TEST_DIR#TEST_DIR#g" \
-e "s#$TEST_DIR#TEST_DIR#g" \
Expand All @@ -141,7 +142,7 @@ _do_filter_img_create()
# precedes ", fmt=") and the options part ($options, which starts
# with "fmt=")
# (And just echo everything before the first "^Formatting")
readarray formatting_line < <($SED -e 's/, fmt=/\n/')
readarray formatting_line < <(gsed -e 's/, fmt=/\n/')

filename_part=${formatting_line[0]}
unset formatting_line[0]
Expand All @@ -168,21 +169,21 @@ _do_filter_img_create()
options=$(
echo "$options" \
| tr '\n' '\0' \
| $SED -e 's/ \([a-z0-9_.-]*\)=/\n\1=/g' \
| gsed -e 's/ \([a-z0-9_.-]*\)=/\n\1=/g' \
| grep -a -e '^fmt' -e '^size' -e '^backing' -e '^preallocation' \
-e '^encryption' "${grep_data_file[@]}" \
| _filter_img_create_filenames \
| $SED \
| sed \
-e 's/^\(fmt\)/0-\1/' \
-e 's/^\(size\)/1-\1/' \
-e 's/^\(backing\)/2-\1/' \
-e 's/^\(data_file\)/3-\1/' \
-e 's/^\(encryption\)/4-\1/' \
-e 's/^\(preallocation\)/8-\1/' \
| LC_ALL=C sort \
| $SED -e 's/^[0-9]-//' \
| sed -e 's/^[0-9]-//' \
| tr '\n\0' ' \n' \
| $SED -e 's/^ *$//' -e 's/ *$//'
| sed -e 's/^ *$//' -e 's/ *$//'
)

if [ -n "$options" ]; then
Expand All @@ -208,7 +209,7 @@ _filter_img_create()

_filter_img_create_size()
{
$SED -e "s# size=[0-9]\\+# size=SIZE#g"
gsed -e "s# size=[0-9]\\+# size=SIZE#g"
}

_filter_img_info()
Expand All @@ -222,7 +223,7 @@ _filter_img_info()

discard=0
regex_json_spec_start='^ *"format-specific": \{'
$SED -e "s#$REMOTE_TEST_DIR#TEST_DIR#g" \
gsed -e "s#$REMOTE_TEST_DIR#TEST_DIR#g" \
-e "s#$IMGPROTO:$TEST_DIR#TEST_DIR#g" \
-e "s#$TEST_DIR#TEST_DIR#g" \
-e "s#$SOCK_DIR#SOCK_DIR#g" \
Expand Down Expand Up @@ -284,7 +285,7 @@ _filter_qemu_img_map()
data_file_filter=(-e "s#$data_file_pattern#\\1#")
fi

$SED -e 's/\([0-9a-fx]* *[0-9a-fx]* *\)[0-9a-fx]* */\1/g' \
sed -e 's/\([0-9a-fx]* *[0-9a-fx]* *\)[0-9a-fx]* */\1/g' \
-e 's/"offset": [0-9]\+/"offset": OFFSET/g' \
-e 's/Mapped to *//' \
"${data_file_filter[@]}" \
Expand All @@ -298,7 +299,7 @@ _filter_nbd()
# receive callbacks sometimes, making them unreliable.
#
# Filter out the TCP port number since this changes between runs.
$SED -e '/nbd\/.*\.c:/d' \
sed -e '/nbd\/.*\.c:/d' \
-e 's#127\.0\.0\.1:[0-9]*#127.0.0.1:PORT#g' \
-e "s#?socket=$SOCK_DIR#?socket=SOCK_DIR#g" \
-e 's#\(foo\|PORT/\?\|.sock\): Failed to .*$#\1#'
Expand Down Expand Up @@ -335,14 +336,14 @@ sys.stdout.write(result)'

_filter_authz_check_tls()
{
$SED -e 's/TLS x509 authz check for .* is denied/TLS x509 authz check for DISTINGUISHED-NAME is denied/'
sed -e 's/TLS x509 authz check for .* is denied/TLS x509 authz check for DISTINGUISHED-NAME is denied/'
}

_filter_qcow2_compression_type_bit()
{
$SED -e 's/\(incompatible_features\s\+\)\[3\(, \)\?/\1[/' \
-e 's/\(incompatible_features.*\), 3\]/\1]/' \
-e 's/\(incompatible_features.*\), 3\(,.*\)/\1\2/'
gsed -e 's/\(incompatible_features\s\+\)\[3\(, \)\?/\1[/' \
-e 's/\(incompatible_features.*\), 3\]/\1]/' \
-e 's/\(incompatible_features.*\), 3\(,.*\)/\1\2/'
}

# make sure this script returns success
Expand Down
45 changes: 23 additions & 22 deletions tests/qemu-iotests/common.rc
Expand Up @@ -17,17 +17,28 @@
# along with this program. If not, see <http://www.gnu.org/licenses/>.
#

SED=
for sed in sed gsed; do
($sed --version | grep 'GNU sed') > /dev/null 2>&1
if [ "$?" -eq 0 ]; then
SED=$sed
break
fi
done
if [ -z "$SED" ]; then
echo "$0: GNU sed not found"
exit 1
# bail out, setting up .notrun file
_notrun()
{
echo "$*" >"$OUTPUT_DIR/$seq.notrun"
echo "$seq not run: $*"
status=0
exit
}

if ! command -v gsed >/dev/null 2>&1; then
if sed --version 2>&1 | grep -v 'not GNU sed' | grep 'GNU sed' > /dev/null;
then
gsed()
{
sed "$@"
}
else
gsed()
{
_notrun "GNU sed not available"
}
fi
fi

dd()
Expand Down Expand Up @@ -722,16 +733,6 @@ _img_info()
done
}

# bail out, setting up .notrun file
#
_notrun()
{
echo "$*" >"$OUTPUT_DIR/$seq.notrun"
echo "$seq not run: $*"
status=0
exit
}

# bail out, setting up .casenotrun file
# The function _casenotrun() is used as a notifier. It is the
# caller's responsibility to make skipped a particular test.
Expand Down Expand Up @@ -920,7 +921,7 @@ _require_working_luks()
IMGFMT='luks' _rm_test_img "$file"

if [ $status != 0 ]; then
reason=$(echo "$output" | grep "$file:" | $SED -e "s#.*$file: *##")
reason=$(echo "$output" | grep "$file:" | sed -e "s#.*$file: *##")
if [ -z "$reason" ]; then
reason="Failed to create a LUKS image"
fi
Expand Down

0 comments on commit 9086c76

Please sign in to comment.