"""
Test that LLDB can launch a linux executable through the dynamic loader and still hit a breakpoint.
"""

import lldb
import os

from lldbsuite.test.decorators import *
from lldbsuite.test.lldbtest import *
from lldbsuite.test import lldbutil


class TestLinux64LaunchingViaDynamicLoader(TestBase):
    @skipIf(oslist=no_match(["linux"]))
    @no_debug_info_test
    @skipIf(oslist=["linux"], archs=["arm$"])
    def test(self):
        self.build()

        # Extracts path of the interpreter.
        spec = lldb.SBModuleSpec()
        spec.SetFileSpec(lldb.SBFileSpec(self.getBuildArtifact("a.out")))
        interp_section = lldb.SBModule(spec).FindSection(".interp")
        if not interp_section:
            return
        section_data = interp_section.GetSectionData()
        error = lldb.SBError()
        exe = section_data.GetString(error, 0)
        if error.Fail():
            return

        target = self.dbg.CreateTarget(exe)
        self.assertTrue(target, VALID_TARGET)

        # Set breakpoints both on shared library function as well as on
        # main. Both of them will be pending breakpoints.
        breakpoint_main = target.BreakpointCreateBySourceRegex(
            "// Break here", lldb.SBFileSpec("main.cpp")
        )
        breakpoint_shared_library = target.BreakpointCreateBySourceRegex(
            "get_signal_crash", lldb.SBFileSpec("signal_file.cpp")
        )
        inferior_exe_path = lldbutil.install_to_target(
            self, self.getBuildArtifact("a.out")
        )
        lldbutil.install_to_target(self, self.getBuildArtifact("libsignal_file.so"))

        launch_info = lldb.SBLaunchInfo(
            [
                "--library-path",
                self.get_process_working_directory(),
                inferior_exe_path,
            ]
        )
        launch_info.SetWorkingDirectory(self.get_process_working_directory())
        error = lldb.SBError()
        process = target.Launch(launch_info, error)
        self.assertSuccess(error)

        # Stopped on main here.
        self.assertState(process.GetState(), lldb.eStateStopped)
        thread = process.GetSelectedThread()
        self.assertIn("main", thread.GetFrameAtIndex(0).GetDisplayFunctionName())
        process.Continue()

        # Stopped on get_signal_crash function here.
        self.assertState(process.GetState(), lldb.eStateStopped)
        self.assertIn(
            "get_signal_crash", thread.GetFrameAtIndex(0).GetDisplayFunctionName()
        )
        process.Continue()

        # Stopped because of generated signal.
        self.assertState(process.GetState(), lldb.eStateStopped)
        self.assertIn("raise", lldbutil.get_function_names(thread))
