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

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


class Minidebuginfo(OESelftestTestCase):
    def test_minidebuginfo(self):
        target_sys = get_bb_var("TARGET_SYS")
        binutils = "binutils-cross-{}".format(get_bb_var("TARGET_ARCH"))

        self.write_config("""
PACKAGE_MINIDEBUGINFO = "1"
IMAGE_FSTYPES = "tar.bz2"
""")
        bitbake("core-image-minimal {}:do_addto_recipe_sysroot".format(binutils))

        deploy_dir = get_bb_var("DEPLOY_DIR_IMAGE")
        native_sysroot = get_bb_var("RECIPE_SYSROOT_NATIVE", binutils)
        readelf = get_bb_var("READELF", "core-image-minimal")

        # confirm that executables and shared libraries contain an ELF section
        # ".gnu_debugdata" which stores minidebuginfo.
        with tempfile.TemporaryDirectory(prefix = "unpackfs-") as unpackedfs:
            filename = os.path.join(deploy_dir, "core-image-minimal-{}.tar.bz2".format(self.td["MACHINE"]))
            shutil.unpack_archive(filename, unpackedfs)

            r = runCmd([readelf, "-W", "-S", os.path.join(unpackedfs, "bin", "busybox")],
                    native_sysroot = native_sysroot, target_sys = target_sys)
            self.assertIn(".gnu_debugdata", r.output)

            r = runCmd([readelf, "-W", "-S", os.path.join(unpackedfs, "lib", "libc.so.6")],
                    native_sysroot = native_sysroot, target_sys = target_sys)
            self.assertIn(".gnu_debugdata", r.output)

