#!/bin/bash
#
# Test qemu-img command line parsing
#
# Copyright (C) 2014 Red Hat, Inc.
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program.  If not, see <http://www.gnu.org/licenses/>.
#

# creator
owner=kwolf@redhat.com

seq=`basename $0`
echo "QA output created by $seq"

here=`pwd`
status=1	# failure is the default!

_cleanup()
{
	_cleanup_test_img
}
trap "_cleanup; exit \$status" 0 1 2 3 15

# get standard environment, filters and checks
. ./common.rc
. ./common.filter

_supported_fmt qcow2
_supported_proto file nfs
_supported_os Linux

function run_qemu_img()
{
    echo
    echo Testing: "$@" | _filter_testdir
    "$QEMU_IMG" "$@" 2>&1 | _filter_testdir
}

size=128M

echo
echo === create: Options specified more than once ===

# Last -f should win
run_qemu_img create -f foo -f $IMGFMT "$TEST_IMG" $size
_img_info

# Multiple -o should be merged
run_qemu_img create -f $IMGFMT -o cluster_size=4k -o lazy_refcounts=on "$TEST_IMG" $size
_img_info --format-specific

# If the same -o key is specified more than once, the last one wins
run_qemu_img create -f $IMGFMT -o cluster_size=4k -o lazy_refcounts=on -o cluster_size=8k "$TEST_IMG" $size
_img_info --format-specific
run_qemu_img create -f $IMGFMT -o cluster_size=4k,cluster_size=8k "$TEST_IMG" $size
_img_info

echo
echo === create: help for -o ===

# Adding the help option to a command without other -o options
run_qemu_img create -f $IMGFMT -o help "$TEST_IMG" $size
run_qemu_img create -f $IMGFMT -o \? "$TEST_IMG" $size

# Adding the help option to the same -o option
run_qemu_img create -f $IMGFMT -o cluster_size=4k,help "$TEST_IMG" $size
run_qemu_img create -f $IMGFMT -o cluster_size=4k,\? "$TEST_IMG" $size
run_qemu_img create -f $IMGFMT -o help,cluster_size=4k "$TEST_IMG" $size
run_qemu_img create -f $IMGFMT -o \?,cluster_size=4k "$TEST_IMG" $size

# Adding the help option to a separate -o option
run_qemu_img create -f $IMGFMT -o cluster_size=4k -o help "$TEST_IMG" $size
run_qemu_img create -f $IMGFMT -o cluster_size=4k -o \? "$TEST_IMG" $size

# Looks like a help option, but is part of the backing file name
run_qemu_img create -f $IMGFMT -o backing_file="$TEST_IMG",,help "$TEST_IMG" $size
run_qemu_img create -f $IMGFMT -o backing_file="$TEST_IMG",,\? "$TEST_IMG" $size

# Try to trick qemu-img into creating escaped commas
run_qemu_img create -f $IMGFMT -o backing_file="$TEST_IMG", -o help "$TEST_IMG" $size
run_qemu_img create -f $IMGFMT -o backing_file="$TEST_IMG" -o ,help "$TEST_IMG" $size
run_qemu_img create -f $IMGFMT -o backing_file="$TEST_IMG" -o ,, -o help "$TEST_IMG" $size

# Leave out everything that isn't needed
run_qemu_img create -f $IMGFMT -o help
run_qemu_img create -o help

echo
echo === convert: Options specified more than once ===

# We need a valid source image
run_qemu_img create -f $IMGFMT "$TEST_IMG" $size

# Last -f should win
run_qemu_img convert -f foo -f $IMGFMT "$TEST_IMG" "$TEST_IMG".base
TEST_IMG="${TEST_IMG}.base" _img_info

# Last -O should win
run_qemu_img convert -O foo -O $IMGFMT "$TEST_IMG" "$TEST_IMG".base
TEST_IMG="${TEST_IMG}.base" _img_info

# Multiple -o should be merged
run_qemu_img convert -O $IMGFMT -o cluster_size=4k -o lazy_refcounts=on "$TEST_IMG" "$TEST_IMG".base
TEST_IMG="${TEST_IMG}.base" _img_info --format-specific

# If the same -o key is specified more than once, the last one wins
run_qemu_img convert -O $IMGFMT -o cluster_size=4k -o lazy_refcounts=on -o cluster_size=8k "$TEST_IMG" "$TEST_IMG".base
TEST_IMG="${TEST_IMG}.base" _img_info --format-specific
run_qemu_img convert -O $IMGFMT -o cluster_size=4k,cluster_size=8k "$TEST_IMG" "$TEST_IMG".base
TEST_IMG="${TEST_IMG}.base" _img_info

echo
echo === convert: help for -o ===

# Adding the help option to a command without other -o options
run_qemu_img convert -O $IMGFMT -o help "$TEST_IMG" "$TEST_IMG".base
run_qemu_img convert -O $IMGFMT -o \? "$TEST_IMG" "$TEST_IMG".base

# Adding the help option to the same -o option
run_qemu_img convert -O $IMGFMT -o cluster_size=4k,help "$TEST_IMG" "$TEST_IMG".base
run_qemu_img convert -O $IMGFMT -o cluster_size=4k,\? "$TEST_IMG" "$TEST_IMG".base
run_qemu_img convert -O $IMGFMT -o help,cluster_size=4k "$TEST_IMG" "$TEST_IMG".base
run_qemu_img convert -O $IMGFMT -o \?,cluster_size=4k "$TEST_IMG" "$TEST_IMG".base

# Adding the help option to a separate -o option
run_qemu_img convert -O $IMGFMT -o cluster_size=4k -o help "$TEST_IMG" "$TEST_IMG".base
run_qemu_img convert -O $IMGFMT -o cluster_size=4k -o \? "$TEST_IMG" "$TEST_IMG".base

# Looks like a help option, but is part of the backing file name
run_qemu_img convert -O $IMGFMT -o backing_file="$TEST_IMG",,help "$TEST_IMG" "$TEST_IMG".base
run_qemu_img convert -O $IMGFMT -o backing_file="$TEST_IMG",,\? "$TEST_IMG" "$TEST_IMG".base

# Try to trick qemu-img into creating escaped commas
run_qemu_img convert -O $IMGFMT -o backing_file="$TEST_IMG", -o help "$TEST_IMG" "$TEST_IMG".base
run_qemu_img convert -O $IMGFMT -o backing_file="$TEST_IMG" -o ,help "$TEST_IMG" "$TEST_IMG".base
run_qemu_img convert -O $IMGFMT -o backing_file="$TEST_IMG" -o ,, -o help "$TEST_IMG" "$TEST_IMG".base

# Leave out everything that isn't needed
run_qemu_img convert -O $IMGFMT -o help
run_qemu_img convert -o help

echo
echo === amend: Options specified more than once ===

# Last -f should win
run_qemu_img amend -f foo -f $IMGFMT -o lazy_refcounts=on "$TEST_IMG"
_img_info --format-specific

# Multiple -o should be merged
run_qemu_img amend -f $IMGFMT -o size=130M -o lazy_refcounts=off "$TEST_IMG"
_img_info --format-specific

# If the same -o key is specified more than once, the last one wins
run_qemu_img amend -f $IMGFMT -o size=8M -o lazy_refcounts=on -o size=132M "$TEST_IMG"
_img_info --format-specific
run_qemu_img amend -f $IMGFMT -o size=4M,size=148M "$TEST_IMG"
_img_info

echo
echo === amend: help for -o ===

# Adding the help option to a command without other -o options
run_qemu_img amend -f $IMGFMT -o help "$TEST_IMG"
run_qemu_img amend -f $IMGFMT -o \? "$TEST_IMG"

# Adding the help option to the same -o option
run_qemu_img amend -f $IMGFMT -o cluster_size=4k,help "$TEST_IMG"
run_qemu_img amend -f $IMGFMT -o cluster_size=4k,\? "$TEST_IMG"
run_qemu_img amend -f $IMGFMT -o help,cluster_size=4k "$TEST_IMG"
run_qemu_img amend -f $IMGFMT -o \?,cluster_size=4k "$TEST_IMG"

# Adding the help option to a separate -o option
run_qemu_img amend -f $IMGFMT -o cluster_size=4k -o help "$TEST_IMG"
run_qemu_img amend -f $IMGFMT -o cluster_size=4k -o \? "$TEST_IMG"

# Looks like a help option, but is part of the backing file name
run_qemu_img amend -f $IMGFMT -o backing_file="$TEST_IMG",,help "$TEST_IMG"
run_qemu_img rebase -u -b "" -f $IMGFMT "$TEST_IMG"

run_qemu_img amend -f $IMGFMT -o backing_file="$TEST_IMG",,\? "$TEST_IMG"
run_qemu_img rebase -u -b "" -f $IMGFMT "$TEST_IMG"

# Try to trick qemu-img into creating escaped commas
run_qemu_img amend -f $IMGFMT -o backing_file="$TEST_IMG", -o help "$TEST_IMG"
run_qemu_img amend -f $IMGFMT -o backing_file="$TEST_IMG" -o ,help "$TEST_IMG"
run_qemu_img amend -f $IMGFMT -o backing_file="$TEST_IMG" -o ,, -o help "$TEST_IMG"

# Leave out everything that isn't needed
run_qemu_img amend -f $IMGFMT -o help
run_qemu_img convert -o help

# success, all done
echo "*** done"
rm -f $seq.full
status=0
