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