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