2020-05-07 11:25:21 +03:00
|
|
|
#!/usr/bin/env bash
|
2021-01-16 16:44:19 +03:00
|
|
|
# group: auto quick
|
2020-05-07 11:25:21 +03:00
|
|
|
#
|
|
|
|
# Test case for an image using zstd compression
|
|
|
|
#
|
|
|
|
# Copyright (c) 2020 Virtuozzo International GmbH
|
|
|
|
#
|
|
|
|
# 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 2 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 <http://www.gnu.org/licenses/>.
|
|
|
|
#
|
|
|
|
|
|
|
|
# creator
|
|
|
|
owner=dplotnikov@virtuozzo.com
|
|
|
|
|
|
|
|
seq="$(basename $0)"
|
|
|
|
echo "QA output created by $seq"
|
|
|
|
|
|
|
|
status=1 # failure is the default!
|
|
|
|
|
|
|
|
# standard environment
|
|
|
|
. ./common.rc
|
|
|
|
. ./common.filter
|
|
|
|
|
|
|
|
# This tests qocw2-specific low-level functionality
|
|
|
|
_supported_fmt qcow2
|
2020-10-27 22:05:59 +03:00
|
|
|
_supported_proto file fuse
|
2020-05-07 11:25:21 +03:00
|
|
|
_supported_os Linux
|
|
|
|
_unsupported_imgopts 'compat=0.10' data_file
|
|
|
|
|
|
|
|
COMPR_IMG="$TEST_IMG.compressed"
|
|
|
|
RAND_FILE="$TEST_DIR/rand_data"
|
|
|
|
|
|
|
|
_cleanup()
|
|
|
|
{
|
|
|
|
_cleanup_test_img
|
|
|
|
_rm_test_img "$COMPR_IMG"
|
|
|
|
rm -f "$RAND_FILE"
|
|
|
|
}
|
|
|
|
trap "_cleanup; exit \$status" 0 1 2 3 15
|
|
|
|
|
|
|
|
# for all the cases
|
|
|
|
CLUSTER_SIZE=65536
|
|
|
|
|
|
|
|
# Check if we can run this test.
|
2020-10-27 22:05:55 +03:00
|
|
|
output=$(_make_test_img -o 'compression_type=zstd' 64M; _cleanup_test_img)
|
|
|
|
if echo "$output" | grep -q "Invalid parameter 'zstd'"; then
|
2020-05-07 11:25:21 +03:00
|
|
|
_notrun "ZSTD is disabled"
|
|
|
|
fi
|
|
|
|
|
|
|
|
echo
|
|
|
|
echo "=== Testing compression type incompatible bit setting for zlib ==="
|
|
|
|
echo
|
|
|
|
_make_test_img -o compression_type=zlib 64M
|
|
|
|
$PYTHON qcow2.py "$TEST_IMG" dump-header | grep incompatible_features
|
|
|
|
|
|
|
|
echo
|
|
|
|
echo "=== Testing compression type incompatible bit setting for zstd ==="
|
|
|
|
echo
|
|
|
|
_make_test_img -o compression_type=zstd 64M
|
|
|
|
$PYTHON qcow2.py "$TEST_IMG" dump-header | grep incompatible_features
|
|
|
|
|
|
|
|
echo
|
|
|
|
echo "=== Testing zlib with incompatible bit set ==="
|
|
|
|
echo
|
|
|
|
_make_test_img -o compression_type=zlib 64M
|
|
|
|
$PYTHON qcow2.py "$TEST_IMG" set-feature-bit incompatible 3
|
|
|
|
# to make sure the bit was actually set
|
|
|
|
$PYTHON qcow2.py "$TEST_IMG" dump-header | grep incompatible_features
|
|
|
|
|
|
|
|
if $QEMU_IMG info "$TEST_IMG" >/dev/null 2>&1 ; then
|
|
|
|
echo "Error: The image opened successfully. The image must not be opened."
|
|
|
|
fi
|
|
|
|
|
|
|
|
echo
|
|
|
|
echo "=== Testing zstd with incompatible bit unset ==="
|
|
|
|
echo
|
|
|
|
_make_test_img -o compression_type=zstd 64M
|
|
|
|
$PYTHON qcow2.py "$TEST_IMG" set-header incompatible_features 0
|
|
|
|
# to make sure the bit was actually unset
|
|
|
|
$PYTHON qcow2.py "$TEST_IMG" dump-header | grep incompatible_features
|
|
|
|
|
|
|
|
if $QEMU_IMG info "$TEST_IMG" >/dev/null 2>&1 ; then
|
|
|
|
echo "Error: The image opened successfully. The image must not be opened."
|
|
|
|
fi
|
|
|
|
|
|
|
|
echo
|
|
|
|
echo "=== Testing compression type values ==="
|
|
|
|
echo
|
|
|
|
# zlib=0
|
|
|
|
_make_test_img -o compression_type=zlib 64M
|
|
|
|
peek_file_be "$TEST_IMG" 104 1
|
|
|
|
echo
|
|
|
|
|
|
|
|
# zstd=1
|
|
|
|
_make_test_img -o compression_type=zstd 64M
|
|
|
|
peek_file_be "$TEST_IMG" 104 1
|
|
|
|
echo
|
|
|
|
|
|
|
|
echo
|
|
|
|
echo "=== Testing simple reading and writing with zstd ==="
|
|
|
|
echo
|
|
|
|
_make_test_img -o compression_type=zstd 64M
|
|
|
|
$QEMU_IO -c "write -c -P 0xAC 64K 64K " "$TEST_IMG" | _filter_qemu_io
|
|
|
|
$QEMU_IO -c "read -P 0xAC 64K 64K " "$TEST_IMG" | _filter_qemu_io
|
|
|
|
# read on the cluster boundaries
|
|
|
|
$QEMU_IO -c "read -v 131070 8 " "$TEST_IMG" | _filter_qemu_io
|
|
|
|
$QEMU_IO -c "read -v 65534 8" "$TEST_IMG" | _filter_qemu_io
|
|
|
|
|
|
|
|
echo
|
|
|
|
echo "=== Testing adjacent clusters reading and writing with zstd ==="
|
|
|
|
echo
|
|
|
|
_make_test_img -o compression_type=zstd 64M
|
|
|
|
$QEMU_IO -c "write -c -P 0xAB 0 64K " "$TEST_IMG" | _filter_qemu_io
|
|
|
|
$QEMU_IO -c "write -c -P 0xAC 64K 64K " "$TEST_IMG" | _filter_qemu_io
|
|
|
|
$QEMU_IO -c "write -c -P 0xAD 128K 64K " "$TEST_IMG" | _filter_qemu_io
|
|
|
|
|
|
|
|
$QEMU_IO -c "read -P 0xAB 0 64k " "$TEST_IMG" | _filter_qemu_io
|
|
|
|
$QEMU_IO -c "read -P 0xAC 64K 64k " "$TEST_IMG" | _filter_qemu_io
|
|
|
|
$QEMU_IO -c "read -P 0xAD 128K 64k " "$TEST_IMG" | _filter_qemu_io
|
|
|
|
|
|
|
|
echo
|
|
|
|
echo "=== Testing incompressible cluster processing with zstd ==="
|
|
|
|
echo
|
|
|
|
# create a 2M image and fill it with 1M likely incompressible data
|
|
|
|
# and 1M compressible data
|
|
|
|
dd if=/dev/urandom of="$RAND_FILE" bs=1M count=1 seek=1
|
|
|
|
QEMU_IO_OPTIONS="$QEMU_IO_OPTIONS_NO_FMT" \
|
|
|
|
$QEMU_IO -f raw -c "write -P 0xFA 0 1M" "$RAND_FILE" | _filter_qemu_io
|
|
|
|
|
|
|
|
$QEMU_IMG convert -f raw -O $IMGFMT -c \
|
|
|
|
-o "$(_optstr_add "$IMGOPTS" "compression_type=zlib")" "$RAND_FILE" \
|
|
|
|
"$TEST_IMG" | _filter_qemu_io
|
|
|
|
|
|
|
|
$QEMU_IMG convert -O $IMGFMT -c \
|
|
|
|
-o "$(_optstr_add "$IMGOPTS" "compression_type=zstd")" "$TEST_IMG" \
|
|
|
|
"$COMPR_IMG" | _filter_qemu_io
|
|
|
|
|
|
|
|
$QEMU_IMG compare "$TEST_IMG" "$COMPR_IMG"
|
|
|
|
|
|
|
|
# success, all done
|
|
|
|
echo "*** done"
|
|
|
|
rm -f $seq.full
|
|
|
|
status=0
|