#!/usr/bin/env python3
# group: rw quick
#
# Test for dumping of qcow2 image metadata
#
# 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
import subprocess
from iotests import qemu_img_create, qemu_io, file_path, log, filter_qemu_io

iotests.script_initialize(supported_fmts=['qcow2'],
                          unsupported_imgopts=['refcount_bits', 'compat'])

disk = file_path('disk')
chunk = 1024 * 1024


def create_bitmap(bitmap_number, disabled):
    granularity = 1 << (14 + bitmap_number)
    bitmap_name = 'bitmap-' + str(bitmap_number)
    args = ['bitmap', '--add', '-g', f'{granularity}', '-f', iotests.imgfmt,
            disk, bitmap_name]
    if disabled:
        args.append('--disable')

    iotests.qemu_img(*args)


def write_to_disk(offset, size):
    write = f'write {offset} {size}'
    log(qemu_io('-c', write, disk), filters=[filter_qemu_io])


def add_bitmap(num, begin, end, disabled):
    log(f'Add bitmap {num}')
    create_bitmap(num, disabled)
    for i in range(begin, end):
        write_to_disk((i) * chunk, chunk)
    log('')


def test(compression_type: str, json_output: bool) -> None:
    qemu_img_create('-f', iotests.imgfmt,
                    '-o', f'compression_type={compression_type}',
                    disk, '10M')
    add_bitmap(1, 0, 6, False)
    add_bitmap(2, 6, 8, True)

    cmd = ['./qcow2.py', disk, 'dump-header']
    if json_output:
        cmd.append('-j')

    subprocess.run(cmd)


test('zlib', False)
test('zstd', True)
