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