1*dd488fc1SDenis Plotnikov#!/usr/bin/env bash 2*dd488fc1SDenis Plotnikov# 3*dd488fc1SDenis Plotnikov# Test case for an image using zstd compression 4*dd488fc1SDenis Plotnikov# 5*dd488fc1SDenis Plotnikov# Copyright (c) 2020 Virtuozzo International GmbH 6*dd488fc1SDenis Plotnikov# 7*dd488fc1SDenis Plotnikov# This program is free software; you can redistribute it and/or modify 8*dd488fc1SDenis Plotnikov# it under the terms of the GNU General Public License as published by 9*dd488fc1SDenis Plotnikov# the Free Software Foundation; either version 2 of the License, or 10*dd488fc1SDenis Plotnikov# (at your option) any later version. 11*dd488fc1SDenis Plotnikov# 12*dd488fc1SDenis Plotnikov# This program is distributed in the hope that it will be useful, 13*dd488fc1SDenis Plotnikov# but WITHOUT ANY WARRANTY; without even the implied warranty of 14*dd488fc1SDenis Plotnikov# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 15*dd488fc1SDenis Plotnikov# GNU General Public License for more details. 16*dd488fc1SDenis Plotnikov# 17*dd488fc1SDenis Plotnikov# You should have received a copy of the GNU General Public License 18*dd488fc1SDenis Plotnikov# along with this program. If not, see <http://www.gnu.org/licenses/>. 19*dd488fc1SDenis Plotnikov# 20*dd488fc1SDenis Plotnikov 21*dd488fc1SDenis Plotnikov# creator 22*dd488fc1SDenis Plotnikovowner=dplotnikov@virtuozzo.com 23*dd488fc1SDenis Plotnikov 24*dd488fc1SDenis Plotnikovseq="$(basename $0)" 25*dd488fc1SDenis Plotnikovecho "QA output created by $seq" 26*dd488fc1SDenis Plotnikov 27*dd488fc1SDenis Plotnikovstatus=1 # failure is the default! 28*dd488fc1SDenis Plotnikov 29*dd488fc1SDenis Plotnikov# standard environment 30*dd488fc1SDenis Plotnikov. ./common.rc 31*dd488fc1SDenis Plotnikov. ./common.filter 32*dd488fc1SDenis Plotnikov 33*dd488fc1SDenis Plotnikov# This tests qocw2-specific low-level functionality 34*dd488fc1SDenis Plotnikov_supported_fmt qcow2 35*dd488fc1SDenis Plotnikov_supported_proto file 36*dd488fc1SDenis Plotnikov_supported_os Linux 37*dd488fc1SDenis Plotnikov_unsupported_imgopts 'compat=0.10' data_file 38*dd488fc1SDenis Plotnikov 39*dd488fc1SDenis PlotnikovCOMPR_IMG="$TEST_IMG.compressed" 40*dd488fc1SDenis PlotnikovRAND_FILE="$TEST_DIR/rand_data" 41*dd488fc1SDenis Plotnikov 42*dd488fc1SDenis Plotnikov_cleanup() 43*dd488fc1SDenis Plotnikov{ 44*dd488fc1SDenis Plotnikov _cleanup_test_img 45*dd488fc1SDenis Plotnikov _rm_test_img "$COMPR_IMG" 46*dd488fc1SDenis Plotnikov rm -f "$RAND_FILE" 47*dd488fc1SDenis Plotnikov} 48*dd488fc1SDenis Plotnikovtrap "_cleanup; exit \$status" 0 1 2 3 15 49*dd488fc1SDenis Plotnikov 50*dd488fc1SDenis Plotnikov# for all the cases 51*dd488fc1SDenis PlotnikovCLUSTER_SIZE=65536 52*dd488fc1SDenis Plotnikov 53*dd488fc1SDenis Plotnikov# Check if we can run this test. 54*dd488fc1SDenis Plotnikovif IMGOPTS='compression_type=zstd' _make_test_img 64M | 55*dd488fc1SDenis Plotnikov grep "Invalid parameter 'zstd'"; then 56*dd488fc1SDenis Plotnikov _notrun "ZSTD is disabled" 57*dd488fc1SDenis Plotnikovfi 58*dd488fc1SDenis Plotnikov 59*dd488fc1SDenis Plotnikovecho 60*dd488fc1SDenis Plotnikovecho "=== Testing compression type incompatible bit setting for zlib ===" 61*dd488fc1SDenis Plotnikovecho 62*dd488fc1SDenis Plotnikov_make_test_img -o compression_type=zlib 64M 63*dd488fc1SDenis Plotnikov$PYTHON qcow2.py "$TEST_IMG" dump-header | grep incompatible_features 64*dd488fc1SDenis Plotnikov 65*dd488fc1SDenis Plotnikovecho 66*dd488fc1SDenis Plotnikovecho "=== Testing compression type incompatible bit setting for zstd ===" 67*dd488fc1SDenis Plotnikovecho 68*dd488fc1SDenis Plotnikov_make_test_img -o compression_type=zstd 64M 69*dd488fc1SDenis Plotnikov$PYTHON qcow2.py "$TEST_IMG" dump-header | grep incompatible_features 70*dd488fc1SDenis Plotnikov 71*dd488fc1SDenis Plotnikovecho 72*dd488fc1SDenis Plotnikovecho "=== Testing zlib with incompatible bit set ===" 73*dd488fc1SDenis Plotnikovecho 74*dd488fc1SDenis Plotnikov_make_test_img -o compression_type=zlib 64M 75*dd488fc1SDenis Plotnikov$PYTHON qcow2.py "$TEST_IMG" set-feature-bit incompatible 3 76*dd488fc1SDenis Plotnikov# to make sure the bit was actually set 77*dd488fc1SDenis Plotnikov$PYTHON qcow2.py "$TEST_IMG" dump-header | grep incompatible_features 78*dd488fc1SDenis Plotnikov 79*dd488fc1SDenis Plotnikovif $QEMU_IMG info "$TEST_IMG" >/dev/null 2>&1 ; then 80*dd488fc1SDenis Plotnikov echo "Error: The image opened successfully. The image must not be opened." 81*dd488fc1SDenis Plotnikovfi 82*dd488fc1SDenis Plotnikov 83*dd488fc1SDenis Plotnikovecho 84*dd488fc1SDenis Plotnikovecho "=== Testing zstd with incompatible bit unset ===" 85*dd488fc1SDenis Plotnikovecho 86*dd488fc1SDenis Plotnikov_make_test_img -o compression_type=zstd 64M 87*dd488fc1SDenis Plotnikov$PYTHON qcow2.py "$TEST_IMG" set-header incompatible_features 0 88*dd488fc1SDenis Plotnikov# to make sure the bit was actually unset 89*dd488fc1SDenis Plotnikov$PYTHON qcow2.py "$TEST_IMG" dump-header | grep incompatible_features 90*dd488fc1SDenis Plotnikov 91*dd488fc1SDenis Plotnikovif $QEMU_IMG info "$TEST_IMG" >/dev/null 2>&1 ; then 92*dd488fc1SDenis Plotnikov echo "Error: The image opened successfully. The image must not be opened." 93*dd488fc1SDenis Plotnikovfi 94*dd488fc1SDenis Plotnikov 95*dd488fc1SDenis Plotnikovecho 96*dd488fc1SDenis Plotnikovecho "=== Testing compression type values ===" 97*dd488fc1SDenis Plotnikovecho 98*dd488fc1SDenis Plotnikov# zlib=0 99*dd488fc1SDenis Plotnikov_make_test_img -o compression_type=zlib 64M 100*dd488fc1SDenis Plotnikovpeek_file_be "$TEST_IMG" 104 1 101*dd488fc1SDenis Plotnikovecho 102*dd488fc1SDenis Plotnikov 103*dd488fc1SDenis Plotnikov# zstd=1 104*dd488fc1SDenis Plotnikov_make_test_img -o compression_type=zstd 64M 105*dd488fc1SDenis Plotnikovpeek_file_be "$TEST_IMG" 104 1 106*dd488fc1SDenis Plotnikovecho 107*dd488fc1SDenis Plotnikov 108*dd488fc1SDenis Plotnikovecho 109*dd488fc1SDenis Plotnikovecho "=== Testing simple reading and writing with zstd ===" 110*dd488fc1SDenis Plotnikovecho 111*dd488fc1SDenis Plotnikov_make_test_img -o compression_type=zstd 64M 112*dd488fc1SDenis Plotnikov$QEMU_IO -c "write -c -P 0xAC 64K 64K " "$TEST_IMG" | _filter_qemu_io 113*dd488fc1SDenis Plotnikov$QEMU_IO -c "read -P 0xAC 64K 64K " "$TEST_IMG" | _filter_qemu_io 114*dd488fc1SDenis Plotnikov# read on the cluster boundaries 115*dd488fc1SDenis Plotnikov$QEMU_IO -c "read -v 131070 8 " "$TEST_IMG" | _filter_qemu_io 116*dd488fc1SDenis Plotnikov$QEMU_IO -c "read -v 65534 8" "$TEST_IMG" | _filter_qemu_io 117*dd488fc1SDenis Plotnikov 118*dd488fc1SDenis Plotnikovecho 119*dd488fc1SDenis Plotnikovecho "=== Testing adjacent clusters reading and writing with zstd ===" 120*dd488fc1SDenis Plotnikovecho 121*dd488fc1SDenis Plotnikov_make_test_img -o compression_type=zstd 64M 122*dd488fc1SDenis Plotnikov$QEMU_IO -c "write -c -P 0xAB 0 64K " "$TEST_IMG" | _filter_qemu_io 123*dd488fc1SDenis Plotnikov$QEMU_IO -c "write -c -P 0xAC 64K 64K " "$TEST_IMG" | _filter_qemu_io 124*dd488fc1SDenis Plotnikov$QEMU_IO -c "write -c -P 0xAD 128K 64K " "$TEST_IMG" | _filter_qemu_io 125*dd488fc1SDenis Plotnikov 126*dd488fc1SDenis Plotnikov$QEMU_IO -c "read -P 0xAB 0 64k " "$TEST_IMG" | _filter_qemu_io 127*dd488fc1SDenis Plotnikov$QEMU_IO -c "read -P 0xAC 64K 64k " "$TEST_IMG" | _filter_qemu_io 128*dd488fc1SDenis Plotnikov$QEMU_IO -c "read -P 0xAD 128K 64k " "$TEST_IMG" | _filter_qemu_io 129*dd488fc1SDenis Plotnikov 130*dd488fc1SDenis Plotnikovecho 131*dd488fc1SDenis Plotnikovecho "=== Testing incompressible cluster processing with zstd ===" 132*dd488fc1SDenis Plotnikovecho 133*dd488fc1SDenis Plotnikov# create a 2M image and fill it with 1M likely incompressible data 134*dd488fc1SDenis Plotnikov# and 1M compressible data 135*dd488fc1SDenis Plotnikovdd if=/dev/urandom of="$RAND_FILE" bs=1M count=1 seek=1 136*dd488fc1SDenis PlotnikovQEMU_IO_OPTIONS="$QEMU_IO_OPTIONS_NO_FMT" \ 137*dd488fc1SDenis Plotnikov$QEMU_IO -f raw -c "write -P 0xFA 0 1M" "$RAND_FILE" | _filter_qemu_io 138*dd488fc1SDenis Plotnikov 139*dd488fc1SDenis Plotnikov$QEMU_IMG convert -f raw -O $IMGFMT -c \ 140*dd488fc1SDenis Plotnikov-o "$(_optstr_add "$IMGOPTS" "compression_type=zlib")" "$RAND_FILE" \ 141*dd488fc1SDenis Plotnikov"$TEST_IMG" | _filter_qemu_io 142*dd488fc1SDenis Plotnikov 143*dd488fc1SDenis Plotnikov$QEMU_IMG convert -O $IMGFMT -c \ 144*dd488fc1SDenis Plotnikov-o "$(_optstr_add "$IMGOPTS" "compression_type=zstd")" "$TEST_IMG" \ 145*dd488fc1SDenis Plotnikov"$COMPR_IMG" | _filter_qemu_io 146*dd488fc1SDenis Plotnikov 147*dd488fc1SDenis Plotnikov$QEMU_IMG compare "$TEST_IMG" "$COMPR_IMG" 148*dd488fc1SDenis Plotnikov 149*dd488fc1SDenis Plotnikov# success, all done 150*dd488fc1SDenis Plotnikovecho "*** done" 151*dd488fc1SDenis Plotnikovrm -f $seq.full 152*dd488fc1SDenis Plotnikovstatus=0 153