#!/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_log, file_path, log, \
        verify_qcow2_zstd_compression

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

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}'
    qemu_io_log('-c', write, disk)


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)
