#!/usr/bin/env python3
# group: rw quick migration
#
# Test clearing unknown autoclear_features flag by qcow2 after
# migration. This test mimics migration to older qemu.
#
# Copyright (c) 2017 Parallels 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 os
import iotests
from iotests import qemu_img

disk = os.path.join(iotests.test_dir, 'disk')
migfile = os.path.join(iotests.test_dir, 'migfile')

class TestInvalidateAutoclear(iotests.QMPTestCase):

    def tearDown(self):
        self.vm_a.shutdown()
        self.vm_b.shutdown()
        os.remove(disk)
        os.remove(migfile)

    def setUp(self):
        qemu_img('create', '-f', iotests.imgfmt, disk, '1M')

        self.vm_a = iotests.VM(path_suffix='a').add_drive(disk)
        self.vm_a.launch()

        self.vm_b = iotests.VM(path_suffix='b').add_drive(disk)
        self.vm_b.add_incoming("exec: cat '" + migfile + "'")

    def test_migration(self):
        self.vm_a.cmd('migrate', uri='exec:cat>' + migfile)
        self.assertNotEqual(self.vm_a.event_wait("STOP"), None)

        with open(disk, 'r+b') as f:
            f.seek(88) # first byte of autoclear_features field
            f.write(b'\xff')

        self.vm_b.launch()
        while True:
            result = self.vm_b.qmp('query-status')
            if result['return']['status'] == 'running':
                break

        with open(disk, 'rb') as f:
            f.seek(88)
            self.assertEqual(f.read(1), b'\x00')

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