xref: /openbmc/qemu/tests/qemu-iotests/287 (revision dba5aee4)
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