#!/usr/bin/env python3
#
# 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'],
                 supported_protocols=['file'])
