#!/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`
tmp=/tmp/$$
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
_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
run_qemu_img info "$TEST_IMG"

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

# 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
run_qemu_img info "$TEST_IMG"
run_qemu_img create -f $IMGFMT -o cluster_size=4k,cluster_size=8k "$TEST_IMG" $size
run_qemu_img info "$TEST_IMG"

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
run_qemu_img info "$TEST_IMG".base

# Last -O should win
run_qemu_img convert -O foo -O $IMGFMT "$TEST_IMG" "$TEST_IMG".base
run_qemu_img info "$TEST_IMG".base

# Multiple -o should be merged
run_qemu_img convert -O $IMGFMT -o cluster_size=4k -o lazy_refcounts=on "$TEST_IMG" "$TEST_IMG".base
run_qemu_img info "$TEST_IMG".base

# 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
run_qemu_img info "$TEST_IMG".base
run_qemu_img convert -O $IMGFMT -o cluster_size=4k,cluster_size=8k "$TEST_IMG" "$TEST_IMG".base
run_qemu_img info "$TEST_IMG".base

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"
run_qemu_img info "$TEST_IMG"

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

# 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"
run_qemu_img info "$TEST_IMG"
run_qemu_img amend -f $IMGFMT -o size=4M,size=148M "$TEST_IMG"
run_qemu_img info "$TEST_IMG"

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
