#!/bin/sh

. "$(dirname $0)/test-lib.sh"

# This test checks if virsh obeys the proper precedence of different
# URI settings
test_intro "virsh-uriprecedence"

virsh_bin="$abs_top_builddir/tools/virsh"
virsh_cmd="$virsh_bin"
counter=0
ret=0

mock_xdg_ || framework_failure

is_uri_good()
{
    echo "$1" | grep -q -F "$good_uri"
}

test_uri_internal()
{
    test_name=$1
    test_cmd="$virsh_cmd \"$2\""
    result=0

    debug "Running '$test_cmd'"
    out="$($virsh_cmd "$2")"

    if ! is_uri_good "$out"; then
        debug "Invalid output: '$out'"
        result=1
        ret=1
    fi

    counter="$((counter+1))"
    test_result "$counter" "$1" "$result"
}

test_uri_connect()
{
    test_uri_internal "$1" "connect; uri"
}

test_uri_noconnect()
{
    test_uri_internal "$1" "uri"
}

test_uri()
{
    test_uri_connect "$1"
    test_uri_noconnect "$1"
}

# Precedence is the following (lowest priority first):
#
# 1) if run as root, 'uri_default' from /etc/libvirtd/libvirt.conf,
#    otherwise qemu:///session.  There is no way to mock this file for
#    virsh/libvirt.so and the user may have set anything in there that
#    would spoil the test, so we don't test this
#
# 2) 'uri_default' from $XDG_CONFIG_HOME/libvirt/libvirt.conf
#
# 3) LIBVIRT_DEFAULT_URI
#
# 4) VIRSH_DEFAULT_CONNECT_URI
#
# 5) parameter -c (--connect)

unset LIBVIRT_DEFAULT_URI
unset VIRSH_DEFAULT_CONNECT_URI
bad_uri="test:///default?bad_uri"
good_uri="test:///default?good_uri"

printf "uri_default=\"%s\"\n" "$good_uri" >"$XDG_CONFIG_HOME/libvirt/libvirt.conf"
if uid_is_privileged_; then
    counter="$((counter+1))"
    test_skip_case "$counter" "User config file" "must not be run as root"
else
    test_uri "User config file"
fi

printf "uri_default=\"%s\"\n" "$bad_uri" >"$XDG_CONFIG_HOME/libvirt/libvirt.conf"
export LIBVIRT_DEFAULT_URI="$good_uri"
test_uri "LIBVIRT_DEFAULT_URI"

export LIBVIRT_DEFAULT_URI="$bad_uri"
export VIRSH_DEFAULT_CONNECT_URI="$good_uri"
test_uri "VIRSH_DEFAULT_CONNECT_URI"

export VIRSH_DEFAULT_CONNECT_URI="$bad_uri"
virsh_cmd="$virsh_bin --connect $good_uri"
test_uri "Parameter"

test_final "$counter" "$ret"
(exit "$ret"); exit "$ret"