#!/usr/bin/env python3
# group: rw quick
#
# Copy-on-read tests using a COR filter with a bottom node
#
# Copyright (C) 2018 Red Hat, Inc.
# Copyright (c) 2020 Virtuozzo International GmbH
#
# 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 iotests
from iotests import log, qemu_img, qemu_io_silent

# Need backing file support
iotests.script_initialize(supported_fmts=['qcow2'],
                          supported_platforms=['linux'])

log('')
log('=== Copy-on-read across nodes ===')
log('')

# This test is similar to the 216 one by Max Reitz <mreitz@redhat.com>
# The difference is that this test case involves a bottom node to the
# COR filter driver.

with iotests.FilePath('base.img') as base_img_path, \
     iotests.FilePath('mid.img') as mid_img_path, \
     iotests.FilePath('top.img') as top_img_path, \
     iotests.VM() as vm:

    log('--- Setting up images ---')
    log('')

    assert qemu_img('create', '-f', iotests.imgfmt, base_img_path, '64M') == 0
    assert qemu_io_silent(base_img_path, '-c', 'write -P 1 0M 1M') == 0
    assert qemu_io_silent(base_img_path, '-c', 'write -P 1 3M 1M') == 0
    assert qemu_img('create', '-f', iotests.imgfmt, '-b', base_img_path,
                    '-F', iotests.imgfmt, mid_img_path) == 0
    assert qemu_io_silent(mid_img_path,  '-c', 'write -P 3 2M 1M') == 0
    assert qemu_io_silent(mid_img_path,  '-c', 'write -P 3 4M 1M') == 0
    assert qemu_img('create', '-f', iotests.imgfmt, '-b', mid_img_path,
                    '-F', iotests.imgfmt, top_img_path) == 0
    assert qemu_io_silent(top_img_path,  '-c', 'write -P 2 1M 1M') == 0

#      0 1 2 3 4
# top    2
# mid      3   3
# base 1     1

    log('Done')

    log('')
    log('--- Doing COR ---')
    log('')

    vm.launch()

    log(vm.qmp('blockdev-add',
               node_name='node0',
               driver='copy-on-read',
               bottom='node2',
               file={
                   'driver': iotests.imgfmt,
                   'file': {
                       'driver': 'file',
                       'filename': top_img_path
                   },
                   'backing': {
                       'node-name': 'node2',
                       'driver': iotests.imgfmt,
                       'file': {
                           'driver': 'file',
                           'filename': mid_img_path
                       },
                       'backing': {
                           'driver': iotests.imgfmt,
                           'file': {
                               'driver': 'file',
                               'filename': base_img_path
                           }
                       },
                   }
               }))

    # Trigger COR
    log(vm.qmp('human-monitor-command',
               command_line='qemu-io node0 "read 0 5M"'))

    vm.shutdown()

    log('')
    log('--- Checking COR result ---')
    log('')

    # Detach backing to check that we can read the data from the top level now
    assert qemu_img('rebase', '-u', '-b', '', '-f', iotests.imgfmt,
                    top_img_path) == 0

    assert qemu_io_silent(top_img_path,  '-c', 'read -P 0 0 1M') == 0
    assert qemu_io_silent(top_img_path,  '-c', 'read -P 2 1M 1M') == 0
    assert qemu_io_silent(top_img_path,  '-c', 'read -P 3 2M 1M') == 0
    assert qemu_io_silent(top_img_path,  '-c', 'read -P 0 3M 1M') == 0
    assert qemu_io_silent(top_img_path,  '-c', 'read -P 3 4M 1M') == 0

    log('Done')
