#!/usr/bin/env python
#
# 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):
        result = self.vm_a.qmp('migrate', uri='exec:cat>' + migfile)
        self.assert_qmp(result, 'return', {});
        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'])
