#!/usr/bin/env bash
#
# 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
_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.
if IMGOPTS='compression_type=zstd' _make_test_img 64M |
    grep "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
