#!/usr/bin/env bash
#
# Test I/O throttle block filter driver interface
#
# Copyright (C) 2017 Manos Pitsidianakis
#
# 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="Manos Pitsidianakis"

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

status=1	# failure is the default!

trap "exit \$status" 0 1 2 3 15

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

_supported_os Linux
_require_drivers throttle

do_run_qemu()
{
    echo Testing: "$@" | _filter_imgfmt
    $QEMU -nographic -qmp-pretty stdio -serial none "$@"
    echo
}

run_qemu()
{
    do_run_qemu "$@" 2>&1 | _filter_testdir | _filter_qemu | _filter_qmp\
                          | _filter_qemu_io | _filter_generated_node_ids \
                          | _filter_actual_image_size
}

test_throttle=$($QEMU_IMG --help|grep throttle)
[ "$test_throttle" = "" ] && _supported_fmt throttle

echo
echo "== checking interface =="

run_qemu <<EOF
{ "execute": "qmp_capabilities" }
{ "execute": "blockdev-add",
  "arguments": {
    "driver": "null-co",
    "node-name": "disk0"
  }
}
{ "execute": "object-add",
  "arguments": {
    "qom-type": "throttle-group",
    "id": "group0",
    "props": {
      "limits" : {
        "iops-total": 1000
      }
    }
  }
}
{ "execute": "blockdev-add",
  "arguments": {
    "driver": "throttle",
    "node-name": "throttle0",
    "throttle-group": "group0",
    "file": "disk0"
  }
}
{ "execute": "query-named-block-nodes" }
{ "execute": "query-block" }
{ "execute": "quit" }
EOF

echo
echo "== property changes in ThrottleGroup =="

run_qemu <<EOF
{ "execute": "qmp_capabilities" }
{ "execute": "object-add",
  "arguments": {
    "qom-type": "throttle-group",
    "id": "group0",
    "props" : {
      "limits": {
          "iops-total": 1000
      }
    }
  }
}
{ "execute" : "qom-get",
  "arguments" : {
    "path" : "group0",
    "property" : "limits"
  }
}
{ "execute" : "qom-set",
    "arguments" : {
        "path" : "group0",
        "property" : "limits",
        "value" : {
            "iops-total" : 0
        }
    }
}
{ "execute" : "qom-get",
  "arguments" : {
    "path" : "group0",
    "property" : "limits"
  }
}
{ "execute": "quit" }
EOF

echo
echo "== object creation/set errors  =="

run_qemu <<EOF
{ "execute": "qmp_capabilities" }
{ "execute": "object-add",
  "arguments": {
    "qom-type": "throttle-group",
    "id": "group0",
    "props" : {
      "limits": {
          "iops-total": 1000
      }
    }
  }
}
{ "execute" : "qom-set",
  "arguments" : {
    "path" : "group0",
    "property" : "x-iops-total",
    "value" : 0
  }
}
{ "execute" : "qom-set",
    "arguments" : {
        "path" : "group0",
        "property" : "limits",
        "value" : {
            "iops-total" : 10,
            "iops-read" : 10
        }
    }
}
{ "execute": "quit" }
EOF

echo
echo "== don't specify group =="

run_qemu <<EOF
{ "execute": "qmp_capabilities" }
{ "execute": "blockdev-add",
  "arguments": {
    "driver": "null-co",
    "node-name": "disk0"
  }
}
{ "execute": "blockdev-add",
  "arguments": {
    "driver": "throttle",
    "node-name": "throttle0",
    "file": "disk0"
  }
}
{ "execute": "quit" }
EOF

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