#
# Copyright OpenEmbedded Contributors
#
# SPDX-License-Identifier: MIT
#
import os
import socketserver
import subprocess

from oeqa.selftest.case import OESelftestTestCase
from oeqa.utils.commands import bitbake, get_bb_var, runqemu

class Debuginfod(OESelftestTestCase):
    def test_debuginfod(self):
        self.write_config("""
DISTRO_FEATURES:append = " debuginfod"
CORE_IMAGE_EXTRA_INSTALL += "elfutils"
        """)
        bitbake("core-image-minimal elfutils-native:do_addto_recipe_sysroot")

        native_sysroot = get_bb_var("RECIPE_SYSROOT_NATIVE", "elfutils-native")
        cmd = [os.path.join(native_sysroot, "usr", "bin", "debuginfod"), "--verbose", get_bb_var("DEPLOY_DIR")]
        for format in get_bb_var("PACKAGE_CLASSES").split():
            if format == "package_deb":
                cmd.append("--scan-deb-dir")
            elif format == "package_ipk":
                cmd.append("--scan-deb-dir")
            elif format == "package_rpm":
                cmd.append("--scan-rpm-dir")
        # Find a free port
        with socketserver.TCPServer(("localhost", 0), None) as s:
            port = s.server_address[1]
            cmd.append("--port=%d" % port)

        try:
            debuginfod = subprocess.Popen(cmd)

            with runqemu("core-image-minimal", runqemuparams="nographic") as qemu:
                cmd = "DEBUGINFOD_URLS=http://%s:%d/ debuginfod-find debuginfo /usr/bin/debuginfod" % (qemu.server_ip, port)
                status, output = qemu.run_serial(cmd)
                # This should be more comprehensive
                self.assertIn("/.cache/debuginfod_client/", output)
        finally:
            debuginfod.kill()
