#!/usr/bin/env python3
# group: rw quick
#
# Tests that "bdrv_drain_all" doesn't drain block jobs
#
# Copyright (C) 2015 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/>.
#

import os
import iotests

class TestStopWithBlockJob(iotests.QMPTestCase):
    test_img = os.path.join(iotests.test_dir, 'test.img')
    target_img = os.path.join(iotests.test_dir, 'target.img')
    base_img = os.path.join(iotests.test_dir, 'base.img')
    overlay_img = os.path.join(iotests.test_dir, 'overlay.img')

    def setUp(self):
        iotests.qemu_img('create', '-f', iotests.imgfmt, self.base_img, "1G")
        iotests.qemu_img('create', '-f', iotests.imgfmt, self.test_img,
                         "-b", self.base_img, '-F', iotests.imgfmt)
        iotests.qemu_io('-f', iotests.imgfmt, '-c', 'write -P0x5d 1M 128M',
                        self.test_img)
        self.vm = iotests.VM()
        self.vm.add_object('throttle-group,id=tg0,x-bps-total=1024')

        source_drive = 'driver=throttle,' \
                       'node-name=source,' \
                       'throttle-group=tg0,' \
                       f'file.driver={iotests.imgfmt},' \
                       f'file.file.filename={self.test_img}'

        self.vm.add_drive(None, source_drive)
        self.vm.launch()

    def tearDown(self):
        self.vm.shutdown()
        for img in (self.test_img, self.target_img, self.base_img,
                    self.overlay_img):
            iotests.try_remove(img)

    def do_test_stop(self, cmd, **args):
        """Test 'stop' while block job is running on a throttled drive.
        The 'stop' command shouldn't drain the job"""
        self.vm.cmd(cmd, **args)

        self.vm.cmd("stop")
        result = self.vm.qmp("query-block-jobs")

        self.assert_qmp(result, 'return[0]/status', 'running')
        self.assert_qmp(result, 'return[0]/ready', False)

    def test_drive_mirror(self):
        self.do_test_stop("drive-mirror", device="drive0",
                          target=self.target_img, format=iotests.imgfmt,
                          sync="full", buf_size=65536)

    def test_drive_backup(self):
        # Limit max-chunk and max-workers so that block-copy will not
        # launch so many workers working on so much data each that
        # stop's bdrv_drain_all() would finish the job
        self.do_test_stop("drive-backup", device="drive0",
                          target=self.target_img, format=iotests.imgfmt,
                          sync="full",
                          x_perf={'max-chunk': 65536,
                                  'max-workers': 8})

    def test_block_commit(self):
        # Add overlay above the source node so that we actually use a
        # commit job instead of a mirror job

        iotests.qemu_img('create', '-f', iotests.imgfmt, self.overlay_img,
                         '1G')

        self.vm.cmd('blockdev-add', {
            'node-name': 'overlay',
            'driver': iotests.imgfmt,
            'file': {
                'driver': 'file',
                'filename': self.overlay_img
            }
        })

        self.vm.cmd('blockdev-snapshot',
                    node='source', overlay='overlay')

        self.do_test_stop('block-commit', device='drive0', top_node='source')

if __name__ == '__main__':
    iotests.main(supported_fmts=["qcow2"],
                 supported_protocols=["file"])
