1*32a1681aSStefan Hajnoczi#!/bin/bash 2*32a1681aSStefan Hajnoczi# 3*32a1681aSStefan Hajnoczi# qemu-img measure sub-command tests 4*32a1681aSStefan Hajnoczi# 5*32a1681aSStefan Hajnoczi# Copyright (C) 2017 Red Hat, Inc. 6*32a1681aSStefan Hajnoczi# 7*32a1681aSStefan Hajnoczi# This program is free software; you can redistribute it and/or modify 8*32a1681aSStefan Hajnoczi# it under the terms of the GNU General Public License as published by 9*32a1681aSStefan Hajnoczi# the Free Software Foundation; either version 2 of the License, or 10*32a1681aSStefan Hajnoczi# (at your option) any later version. 11*32a1681aSStefan Hajnoczi# 12*32a1681aSStefan Hajnoczi# This program is distributed in the hope that it will be useful, 13*32a1681aSStefan Hajnoczi# but WITHOUT ANY WARRANTY; without even the implied warranty of 14*32a1681aSStefan Hajnoczi# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 15*32a1681aSStefan Hajnoczi# GNU General Public License for more details. 16*32a1681aSStefan Hajnoczi# 17*32a1681aSStefan Hajnoczi# You should have received a copy of the GNU General Public License 18*32a1681aSStefan Hajnoczi# along with this program. If not, see <http://www.gnu.org/licenses/>. 19*32a1681aSStefan Hajnoczi# 20*32a1681aSStefan Hajnoczi 21*32a1681aSStefan Hajnoczi# creator 22*32a1681aSStefan Hajnocziowner=stefanha@redhat.com 23*32a1681aSStefan Hajnoczi 24*32a1681aSStefan Hajnocziseq=`basename $0` 25*32a1681aSStefan Hajnocziecho "QA output created by $seq" 26*32a1681aSStefan Hajnoczi 27*32a1681aSStefan Hajnoczihere=`pwd` 28*32a1681aSStefan Hajnoczistatus=1 # failure is the default! 29*32a1681aSStefan Hajnoczi 30*32a1681aSStefan Hajnoczi_cleanup() 31*32a1681aSStefan Hajnoczi{ 32*32a1681aSStefan Hajnoczi _cleanup_test_img 33*32a1681aSStefan Hajnoczi rm -f "$TEST_IMG.converted" 34*32a1681aSStefan Hajnoczi} 35*32a1681aSStefan Hajnoczitrap "_cleanup; exit \$status" 0 1 2 3 15 36*32a1681aSStefan Hajnoczi 37*32a1681aSStefan Hajnoczi# get standard environment, filters and checks 38*32a1681aSStefan Hajnoczi. ./common.rc 39*32a1681aSStefan Hajnoczi. ./common.filter 40*32a1681aSStefan Hajnoczi. ./common.pattern 41*32a1681aSStefan Hajnoczi 42*32a1681aSStefan Hajnoczi_supported_fmt raw qcow2 43*32a1681aSStefan Hajnoczi_supported_proto file 44*32a1681aSStefan Hajnoczi_supported_os Linux 45*32a1681aSStefan Hajnoczi 46*32a1681aSStefan Hajnocziecho "== Input validation ==" 47*32a1681aSStefan Hajnocziecho 48*32a1681aSStefan Hajnoczi 49*32a1681aSStefan Hajnoczi_make_test_img 1G 50*32a1681aSStefan Hajnoczi 51*32a1681aSStefan Hajnoczi$QEMU_IMG measure # missing arguments 52*32a1681aSStefan Hajnoczi$QEMU_IMG measure --size 2G "$TEST_IMG" # only one allowed 53*32a1681aSStefan Hajnoczi$QEMU_IMG measure "$TEST_IMG" a # only one filename allowed 54*32a1681aSStefan Hajnoczi$QEMU_IMG measure --object secret,id=sec0,data=MTIzNDU2,format=base64 # missing filename 55*32a1681aSStefan Hajnoczi$QEMU_IMG measure --image-opts # missing filename 56*32a1681aSStefan Hajnoczi$QEMU_IMG measure -f qcow2 # missing filename 57*32a1681aSStefan Hajnoczi$QEMU_IMG measure -l snap1 # missing filename 58*32a1681aSStefan Hajnoczi$QEMU_IMG measure -o , # invalid option list 59*32a1681aSStefan Hajnoczi$QEMU_IMG measure -l snapshot.foo # invalid snapshot option 60*32a1681aSStefan Hajnoczi$QEMU_IMG measure --output foo # invalid output format 61*32a1681aSStefan Hajnoczi$QEMU_IMG measure --size -1 # invalid image size 62*32a1681aSStefan Hajnoczi$QEMU_IMG measure -O foo "$TEST_IMG" # unknown image file format 63*32a1681aSStefan Hajnoczi 64*32a1681aSStefan Hajnoczimake_test_img_with_fmt() { 65*32a1681aSStefan Hajnoczi # Shadow global variables within this function 66*32a1681aSStefan Hajnoczi local IMGFMT="$1" IMGOPTS="" 67*32a1681aSStefan Hajnoczi _make_test_img "$2" 68*32a1681aSStefan Hajnoczi} 69*32a1681aSStefan Hajnoczi 70*32a1681aSStefan Hajnocziqemu_io_with_fmt() { 71*32a1681aSStefan Hajnoczi # Shadow global variables within this function 72*32a1681aSStefan Hajnoczi local QEMU_IO_OPTIONS=$(echo "$QEMU_IO_OPTIONS" | sed "s/-f $IMGFMT/-f $1/") 73*32a1681aSStefan Hajnoczi shift 74*32a1681aSStefan Hajnoczi $QEMU_IO "$@" 75*32a1681aSStefan Hajnoczi} 76*32a1681aSStefan Hajnoczi 77*32a1681aSStefan Hajnoczi# The proof is in the pudding: converted image size cannot be larger than the 78*32a1681aSStefan Hajnoczi# required size. 79*32a1681aSStefan Hajnoczi# 80*32a1681aSStefan Hajnoczi# Note: if a change to the image format code causes the file size to change, 81*32a1681aSStefan Hajnoczi# then this test fails! This is good because it's a reminder to check that the 82*32a1681aSStefan Hajnoczi# required size is still at least as big as the actual converted file size. 83*32a1681aSStefan Hajnocziconvert_and_show_size() { 84*32a1681aSStefan Hajnoczi local fmt="$1" 85*32a1681aSStefan Hajnoczi shift 86*32a1681aSStefan Hajnoczi $QEMU_IMG convert -f "$fmt" -O "$IMGFMT" "$TEST_IMG" "$@" "$TEST_IMG.converted" 87*32a1681aSStefan Hajnoczi stat -c "converted image file size in bytes: %s" "$TEST_IMG.converted" 88*32a1681aSStefan Hajnoczi} 89*32a1681aSStefan Hajnoczi 90*32a1681aSStefan Hajnoczifor ofmt in human json; do 91*32a1681aSStefan Hajnoczi echo 92*32a1681aSStefan Hajnoczi echo "== Size calculation for a new file ($ofmt) ==" 93*32a1681aSStefan Hajnoczi echo 94*32a1681aSStefan Hajnoczi 95*32a1681aSStefan Hajnoczi # Try a few interesting sizes 96*32a1681aSStefan Hajnoczi $QEMU_IMG measure --output=$ofmt -O "$IMGFMT" --size 0 97*32a1681aSStefan Hajnoczi $QEMU_IMG measure --output=$ofmt -O "$IMGFMT" --size 2G 98*32a1681aSStefan Hajnoczi $QEMU_IMG measure --output=$ofmt -O "$IMGFMT" --size 64G 99*32a1681aSStefan Hajnoczi $QEMU_IMG measure --output=$ofmt -O "$IMGFMT" --size 256G 100*32a1681aSStefan Hajnoczi $QEMU_IMG measure --output=$ofmt -O "$IMGFMT" --size 1T 101*32a1681aSStefan Hajnoczi $QEMU_IMG measure --output=$ofmt -O "$IMGFMT" --size 2P 102*32a1681aSStefan Hajnoczi $QEMU_IMG measure --output=$ofmt -O "$IMGFMT" --size 7E 103*32a1681aSStefan Hajnoczi 104*32a1681aSStefan Hajnoczi # Always test the raw input files but also IMGFMT 105*32a1681aSStefan Hajnoczi for fmt in $(echo -e "raw\n$IMGFMT\n" | sort -u); do 106*32a1681aSStefan Hajnoczi echo 107*32a1681aSStefan Hajnoczi echo "== Empty $fmt input image ($ofmt) ==" 108*32a1681aSStefan Hajnoczi echo 109*32a1681aSStefan Hajnoczi make_test_img_with_fmt "$fmt" 0 110*32a1681aSStefan Hajnoczi $QEMU_IMG measure --output=$ofmt -f "$fmt" -O "$IMGFMT" "$TEST_IMG" 111*32a1681aSStefan Hajnoczi echo 112*32a1681aSStefan Hajnoczi convert_and_show_size "$fmt" 113*32a1681aSStefan Hajnoczi 114*32a1681aSStefan Hajnoczi echo 115*32a1681aSStefan Hajnoczi echo "== $fmt input image with data ($ofmt) ==" 116*32a1681aSStefan Hajnoczi echo 117*32a1681aSStefan Hajnoczi make_test_img_with_fmt "$fmt" 1G 118*32a1681aSStefan Hajnoczi $QEMU_IMG measure --output=$ofmt -f "$fmt" -O "$IMGFMT" "$TEST_IMG" 119*32a1681aSStefan Hajnoczi qemu_io_with_fmt "$fmt" -c "write 512 512" "$TEST_IMG" | _filter_qemu_io 120*32a1681aSStefan Hajnoczi qemu_io_with_fmt "$fmt" -c "write 64K 64K" "$TEST_IMG" | _filter_qemu_io 121*32a1681aSStefan Hajnoczi if [ "$fmt" = "qcow2" ]; then 122*32a1681aSStefan Hajnoczi $QEMU_IMG snapshot -c snapshot1 "$TEST_IMG" 123*32a1681aSStefan Hajnoczi fi 124*32a1681aSStefan Hajnoczi qemu_io_with_fmt "$fmt" -c "write 128M 63K" "$TEST_IMG" | _filter_qemu_io 125*32a1681aSStefan Hajnoczi $QEMU_IMG measure --output=$ofmt -f "$fmt" -O "$IMGFMT" "$TEST_IMG" 126*32a1681aSStefan Hajnoczi echo 127*32a1681aSStefan Hajnoczi convert_and_show_size "$fmt" 128*32a1681aSStefan Hajnoczi 129*32a1681aSStefan Hajnoczi if [ "$fmt" = "qcow2" ]; then 130*32a1681aSStefan Hajnoczi echo 131*32a1681aSStefan Hajnoczi echo "== $fmt input image with internal snapshot ($ofmt) ==" 132*32a1681aSStefan Hajnoczi echo 133*32a1681aSStefan Hajnoczi $QEMU_IMG measure --output=$ofmt -f "$fmt" -l snapshot1 \ 134*32a1681aSStefan Hajnoczi -O "$IMGFMT" "$TEST_IMG" 135*32a1681aSStefan Hajnoczi echo 136*32a1681aSStefan Hajnoczi convert_and_show_size "$fmt" -l snapshot1 137*32a1681aSStefan Hajnoczi fi 138*32a1681aSStefan Hajnoczi 139*32a1681aSStefan Hajnoczi if [ "$IMGFMT" = "qcow2" ]; then 140*32a1681aSStefan Hajnoczi echo 141*32a1681aSStefan Hajnoczi echo "== $fmt input image and a backing file ($ofmt) ==" 142*32a1681aSStefan Hajnoczi echo 143*32a1681aSStefan Hajnoczi # The backing file doesn't need to exist :) 144*32a1681aSStefan Hajnoczi $QEMU_IMG measure --output=$ofmt -o backing_file=x \ 145*32a1681aSStefan Hajnoczi -f "$fmt" -O "$IMGFMT" "$TEST_IMG" 146*32a1681aSStefan Hajnoczi fi 147*32a1681aSStefan Hajnoczi 148*32a1681aSStefan Hajnoczi echo 149*32a1681aSStefan Hajnoczi echo "== $fmt input image and preallocation ($ofmt) ==" 150*32a1681aSStefan Hajnoczi echo 151*32a1681aSStefan Hajnoczi $QEMU_IMG measure --output=$ofmt -o preallocation=full \ 152*32a1681aSStefan Hajnoczi -f "$fmt" -O "$IMGFMT" "$TEST_IMG" 153*32a1681aSStefan Hajnoczi echo 154*32a1681aSStefan Hajnoczi convert_and_show_size "$fmt" -o preallocation=full 155*32a1681aSStefan Hajnoczi 156*32a1681aSStefan Hajnoczi echo 157*32a1681aSStefan Hajnoczi echo "== Fully-allocated $fmt input image ($ofmt) ==" 158*32a1681aSStefan Hajnoczi echo 159*32a1681aSStefan Hajnoczi make_test_img_with_fmt "$fmt" 8M 160*32a1681aSStefan Hajnoczi qemu_io_with_fmt "$fmt" -c "write 0 8M" "$TEST_IMG" | _filter_qemu_io 161*32a1681aSStefan Hajnoczi $QEMU_IMG measure --output=$ofmt -f "$fmt" -O "$IMGFMT" "$TEST_IMG" 162*32a1681aSStefan Hajnoczi echo 163*32a1681aSStefan Hajnoczi convert_and_show_size "$fmt" 164*32a1681aSStefan Hajnoczi done 165*32a1681aSStefan Hajnoczidone 166*32a1681aSStefan Hajnoczi 167*32a1681aSStefan Hajnoczi# success, all done 168*32a1681aSStefan Hajnocziecho "*** done" 169*32a1681aSStefan Hajnoczirm -f $seq.full 170*32a1681aSStefan Hajnoczistatus=0 171