#!/usr/bin/env bash
# group: auto quick
#
# 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
_supported_proto file fuse
_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.
output=$(_make_test_img -o 'compression_type=zstd' 64M; _cleanup_test_img)
if echo "$output" | grep -q "Invalid parameter 'zstd'"; then
    _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
