#!/usr/bin/env python3
#
# Tests growing a large refcount table.
#
# Copyright (C) 2012 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 time
import os
import qcow2
from qcow2 import QcowHeader
import iotests
from iotests import qemu_img, qemu_img_verbose, qemu_io
import struct
import subprocess
import sys

test_img = os.path.join(iotests.test_dir, 'test.img')

class TestRefcountTableGrowth(iotests.QMPTestCase):
    '''Abstract base class for image mirroring test cases'''

    def preallocate(self, name):
        fd = open(name, "r+b")
        try:
            off_reftable = 512
            off_refblock = off_reftable + (512 * 512)
            off_l1       = off_refblock + (512 * 512 * 64)
            off_l2       = off_l1 + (512 * 512 * 4 * 8)
            off_data     = off_l2 + (512 * 512 * 4 * 512)

            # Write a new header
            h = QcowHeader(fd)
            h.refcount_table_offset = off_reftable
            h.refcount_table_clusters = 512
            h.l1_table_offset = off_l1
            h.l1_size = 512 * 512 * 4
            h.update(fd)

            # Write a refcount table
            fd.seek(off_reftable)

            for i in range(0, h.refcount_table_clusters):
                sector = b''.join(struct.pack('>Q',
                    off_refblock + i * 64 * 512 + j * 512)
                    for j in range(0, 64))
                fd.write(sector)

            # Write the refcount blocks
            assert(fd.tell() == off_refblock)
            sector = b''.join(struct.pack('>H', 1) for j in range(0, 64 * 256))
            for block in range(0, h.refcount_table_clusters):
                fd.write(sector)

            # Write the L1 table
            assert(fd.tell() == off_l1)
            assert(off_l2 + 512 * h.l1_size == off_data)
            table = b''.join(struct.pack('>Q', (1 << 63) | off_l2 + 512 * j)
                for j in range(0, h.l1_size))
            fd.write(table)

            # Write the L2 tables
            assert(fd.tell() == off_l2)
            img_file_size = h.refcount_table_clusters * 64 * 256 * 512
            remaining = img_file_size - off_data

            off = off_data
            while remaining > 1024 * 512:
                pytable = list((1 << 63) | off + 512 * j
                    for j in range(0, 1024))
                table = struct.pack('>1024Q', *pytable)
                fd.write(table)
                remaining = remaining - 1024 * 512
                off = off + 1024 * 512

            table = b''.join(struct.pack('>Q', (1 << 63) | off + 512 * j)
                for j in range(0, remaining // 512))
            fd.write(table)


            # Data
            fd.truncate(img_file_size)


        finally:
            fd.close()


    def setUp(self):
        qemu_img('create', '-f', iotests.imgfmt, '-o', 'cluster_size=512', test_img, '16G')
        self.preallocate(test_img)
        pass


    def tearDown(self):
        os.remove(test_img)
        pass

    def test_grow_refcount_table(self):
        qemu_io('-c', 'write 3800M 1M', test_img)
        qemu_img_verbose('check' , test_img)
        pass

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