#
# Runtime Tests for Bootable Pipelines
#

import os
import subprocess
import tempfile
import unittest

from .. import test


@unittest.skipUnless(test.TestBase.have_test_data(), "no test-data access")
@unittest.skipUnless(test.TestBase.can_bind_mount(), "root-only")
class TestBoot(test.TestBase):
    def setUp(self):
        self.osbuild = test.OSBuild()

    def test_boot(self):
        #
        # Build an image and test-boot it.
        #

        manifest = os.path.join(self.locate_test_data(),
                                "manifests/fedora-boot.json")

        with self.osbuild as osb:
            with tempfile.TemporaryDirectory(dir="/var/tmp") as temp_dir:
                osb.compile_file(manifest, output_dir=temp_dir, exports=["image"])
                image = os.path.join(temp_dir, "image", "disk.img")
                output_file = os.path.join(temp_dir, "output")

                subprocess.run(["qemu-system-x86_64",
                                "-snapshot",
                                "-m", "1024",
                                "-M", "accel=kvm:hvf:tcg",

                                # be silent
                                "-nographic",
                                "-monitor", "none",
                                "-serial", "none",

                                # create /dev/vport0p1
                                "-chardev", f"file,path={output_file},id=stdio",
                                "-device", "virtio-serial",
                                "-device", "virtserialport,chardev=stdio",

                                image],
                               encoding="utf8",
                               check=True)
                with open(output_file, "r", encoding="utf8") as f:
                    self.assertEqual(f.read().strip(), "running")
