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