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