"""
Test that breakpoint by symbol name works correctly with dynamic libs.
"""

import os
import re
import lldb
from lldbsuite.test.decorators import *
from lldbsuite.test.lldbtest import *
from lldbsuite.test import lldbutil


class LoadUnloadTestCase(TestBase):
    NO_DEBUG_INFO_TESTCASE = True

    def setUp(self):
        # Call super's setUp().
        TestBase.setUp(self)
        self.setup_test()
        # Invoke the default build rule.
        self.build()
        # Find the line number to break for main.cpp.
        self.line = line_number(
            "main.cpp",
            "// Set break point at this line for test_lldb_process_load_and_unload_commands().",
        )
        self.line_d_function = line_number(
            "d.cpp", "// Find this line number within d_dunction()."
        )

    def setup_test(self):
        lldbutil.mkdir_p(self.getBuildArtifact("hidden"))
        if lldb.remote_platform:
            path = lldb.remote_platform.GetWorkingDirectory()
        else:
            path = self.getBuildDir()
            if self.dylibPath in os.environ:
                sep = self.platformContext.shlib_path_separator
                path = os.environ[self.dylibPath] + sep + path
        self.runCmd(
            "settings append target.env-vars '{}={}'".format(self.dylibPath, path)
        )
        self.default_path = path

    def copy_shlibs_to_remote(self, hidden_dir=False):
        """Copies the shared libs required by this test suite to remote.
        Does nothing in case of non-remote platforms.
        """
        if lldb.remote_platform:
            ext = "so"
            if self.platformIsDarwin():
                ext = "dylib"

            shlibs = [
                "libloadunload_a." + ext,
                "libloadunload_b." + ext,
                "libloadunload_c." + ext,
                "libloadunload_d." + ext,
            ]
            wd = lldb.remote_platform.GetWorkingDirectory()
            cwd = os.getcwd()
            for f in shlibs:
                err = lldb.remote_platform.Put(
                    lldb.SBFileSpec(self.getBuildArtifact(f)),
                    lldb.SBFileSpec(lldbutil.join_remote_paths(wd, f)),
                )
                if err.Fail():
                    raise RuntimeError(
                        "Unable copy '%s' to '%s'.\n>>> %s" % (f, wd, err.GetCString())
                    )
            if hidden_dir:
                shlib = "libloadunload_d." + ext
                hidden_dir = os.path.join(wd, "hidden")
                hidden_file = lldbutil.join_remote_paths(hidden_dir, shlib)
                err = lldb.remote_platform.MakeDirectory(hidden_dir)
                if err.Fail():
                    raise RuntimeError(
                        "Unable to create a directory '%s'." % hidden_dir
                    )
                err = lldb.remote_platform.Put(
                    lldb.SBFileSpec(os.path.join("hidden", shlib)),
                    lldb.SBFileSpec(hidden_file),
                )
                if err.Fail():
                    raise RuntimeError(
                        "Unable copy 'libloadunload_d.so' to '%s'.\n>>> %s"
                        % (wd, err.GetCString())
                    )

    def setSvr4Support(self, enabled):
        self.runCmd(
            "settings set plugin.process.gdb-remote.use-libraries-svr4 {enabled}".format(
                enabled="true" if enabled else "false"
            )
        )

    # libloadunload_d.so does not appear in the image list because executable
    # dependencies are resolved relative to the debuggers PWD. Bug?
    @expectedFailureAll(oslist=["freebsd", "linux", "netbsd"])
    @skipIfRemote
    @skipIfWindows  # Windows doesn't have dlopen and friends, dynamic libraries work differently
    def test_modules_search_paths(self):
        """Test target modules list after loading a different copy of the library libd.dylib, and verifies that it works with 'target modules search-paths add'."""
        if self.platformIsDarwin():
            dylibName = "libloadunload_d.dylib"
        else:
            dylibName = "libloadunload_d.so"

        # The directory with the dynamic library we did not link to.
        new_dir = os.path.join(self.getBuildDir(), "hidden")

        old_dylib = os.path.join(self.getBuildDir(), dylibName)
        new_dylib = os.path.join(new_dir, dylibName)
        exe = self.getBuildArtifact("a.out")
        self.runCmd("file " + exe, CURRENT_EXECUTABLE_SET)

        self.expect("target modules list", substrs=[old_dylib])
        # self.expect("target modules list -t 3",
        #    patterns = ["%s-[^-]*-[^-]*" % self.getArchitecture()])
        # Add an image search path substitution pair.
        self.runCmd(
            "target modules search-paths add %s %s" % (self.getBuildDir(), new_dir)
        )

        self.expect(
            "target modules search-paths list", substrs=[self.getBuildDir(), new_dir]
        )

        self.expect(
            "target modules search-paths query %s" % self.getBuildDir(),
            "Image search path successfully transformed",
            substrs=[new_dir],
        )

        # Obliterate traces of libd from the old location.
        os.remove(old_dylib)
        # Inform (DY)LD_LIBRARY_PATH of the new path, too.
        env_cmd_string = (
            "settings replace target.env-vars " + self.dylibPath + "=" + new_dir
        )
        if self.TraceOn():
            print("Set environment to: ", env_cmd_string)
        self.runCmd(env_cmd_string)
        self.runCmd("settings show target.env-vars")

        self.runCmd("run")

        self.expect(
            "target modules list",
            "LLDB successfully locates the relocated dynamic library",
            substrs=[new_dylib],
        )

    # libloadunload_d.so does not appear in the image list because executable
    # dependencies are resolved relative to the debuggers PWD. Bug?
    @expectedFailureAll(oslist=["freebsd", "linux", "netbsd"])
    @expectedFailureAndroid  # wrong source file shows up for hidden library
    @skipIfWindows  # Windows doesn't have dlopen and friends, dynamic libraries work differently
    @skipIfDarwinEmbedded
    def test_dyld_library_path(self):
        """Test (DY)LD_LIBRARY_PATH after moving libd.dylib, which defines d_function, somewhere else."""
        self.copy_shlibs_to_remote(hidden_dir=True)

        exe = self.getBuildArtifact("a.out")
        self.runCmd("file " + exe, CURRENT_EXECUTABLE_SET)

        # Shut off ANSI color usage so we don't get ANSI escape sequences
        # mixed in with stop locations.
        self.dbg.SetUseColor(False)

        if self.platformIsDarwin():
            dylibName = "libloadunload_d.dylib"
            dsymName = "libloadunload_d.dylib.dSYM"
        else:
            dylibName = "libloadunload_d.so"

        # The directory to relocate the dynamic library and its debugging info.
        special_dir = "hidden"
        if lldb.remote_platform:
            wd = lldb.remote_platform.GetWorkingDirectory()
        else:
            wd = self.getBuildDir()

        old_dir = wd
        new_dir = os.path.join(wd, special_dir)
        old_dylib = os.path.join(old_dir, dylibName)

        # For now we don't track (DY)LD_LIBRARY_PATH, so the old
        # library will be in the modules list.
        self.expect(
            "target modules list", substrs=[os.path.basename(old_dylib)], matching=True
        )

        lldbutil.run_break_set_by_file_and_line(
            self, "d.cpp", self.line_d_function, num_expected_locations=1
        )
        # After run, make sure the non-hidden library is picked up.
        self.expect("run", substrs=["return", "700"])

        self.runCmd("continue")

        # Add the hidden directory first in the search path.
        env_cmd_string = "settings set target.env-vars %s=%s%s%s" % (
            self.dylibPath,
            new_dir,
            self.platformContext.shlib_path_separator,
            self.default_path,
        )
        self.runCmd(env_cmd_string)

        # This time, the hidden library should be picked up.
        self.expect("run", substrs=["return", "12345"])

    @expectedFailureAll(
        bugnumber="llvm.org/pr25805", hostoslist=["windows"], triple=".*-android"
    )
    @expectedFailureAll(oslist=["windows"])  # process load not implemented
    def test_lldb_process_load_and_unload_commands(self):
        self.setSvr4Support(False)
        self.run_lldb_process_load_and_unload_commands()

    @expectedFailureAll(
        bugnumber="llvm.org/pr25805", hostoslist=["windows"], triple=".*-android"
    )
    @expectedFailureAll(oslist=["windows"])  # process load not implemented
    def test_lldb_process_load_and_unload_commands_with_svr4(self):
        self.setSvr4Support(True)
        self.run_lldb_process_load_and_unload_commands()

    def run_lldb_process_load_and_unload_commands(self):
        """Test that lldb process load/unload command work correctly."""
        self.copy_shlibs_to_remote()

        exe = self.getBuildArtifact("a.out")
        self.runCmd("file " + exe, CURRENT_EXECUTABLE_SET)

        # Break at main.cpp before the call to dlopen().
        # Use lldb's process load command to load the dylib, instead.

        lldbutil.run_break_set_by_file_and_line(
            self, "main.cpp", self.line, num_expected_locations=1, loc_exact=True
        )

        self.runCmd("run", RUN_SUCCEEDED)

        dylibName = self.platformContext.getFullLibName("loadunload_a")
        localDylibPath = self.getBuildArtifact(dylibName)
        if lldb.remote_platform:
            wd = lldb.remote_platform.GetWorkingDirectory()
            remoteDylibPath = lldbutil.join_remote_paths(wd, dylibName)
        else:
            remoteDylibPath = localDylibPath

        # First make sure that we get some kind of error if process load fails.
        # We print some error even if the load fails, which isn't formalized.
        # The only plugin at present (Posix) that supports this says "unknown reasons".
        # If another plugin shows up, let's require it uses "unknown error" as well.
        non_existant_shlib = "/NoSuchDir/NoSuchSubdir/ReallyNo/NotAFile"
        self.expect(
            "process load %s" % (non_existant_shlib),
            error=True,
            matching=False,
            patterns=["unknown reasons"],
        )

        # Make sure that a_function does not exist at this point.
        self.expect(
            "image lookup -n a_function",
            "a_function should not exist yet",
            error=True,
            matching=False,
            patterns=["1 match found"],
        )

        # Use lldb 'process load' to load the dylib.
        self.expect(
            "process load %s --install=%s" % (localDylibPath, remoteDylibPath),
            "%s loaded correctly" % dylibName,
            patterns=[
                'Loading "%s".*ok' % re.escape(localDylibPath),
                "Image [0-9]+ loaded",
            ],
        )

        # Search for and match the "Image ([0-9]+) loaded" pattern.
        output = self.res.GetOutput()
        pattern = re.compile("Image ([0-9]+) loaded")
        for l in output.split(os.linesep):
            self.trace("l:", l)
            match = pattern.search(l)
            if match:
                break
        index = match.group(1)

        # Now we should have an entry for a_function.
        self.expect(
            "image lookup -n a_function",
            "a_function should now exist",
            patterns=["1 match found .*%s" % dylibName],
        )

        # Use lldb 'process unload' to unload the dylib.
        self.expect(
            "process unload %s" % index,
            "%s unloaded correctly" % dylibName,
            patterns=["Unloading .* with index %s.*ok" % index],
        )

        # Confirm that we unloaded properly.
        self.expect(
            "image lookup -n a_function",
            "a_function should not exist after unload",
            error=True,
            matching=False,
            patterns=["1 match found"],
        )

        self.runCmd("process continue")

    @expectedFailureAll(oslist=["windows"])  # breakpoint not hit
    def test_load_unload(self):
        self.setSvr4Support(False)
        self.run_load_unload()

    @expectedFailureAll(oslist=["windows"])  # breakpoint not hit
    def test_load_unload_with_svr4(self):
        self.setSvr4Support(True)
        self.run_load_unload()

    def run_load_unload(self):
        """Test breakpoint by name works correctly with dlopen'ing."""
        self.copy_shlibs_to_remote()

        exe = self.getBuildArtifact("a.out")
        self.runCmd("file " + exe, CURRENT_EXECUTABLE_SET)

        # Break by function name a_function (not yet loaded).
        lldbutil.run_break_set_by_symbol(self, "a_function", num_expected_locations=0)

        self.runCmd("run", RUN_SUCCEEDED)

        # The stop reason of the thread should be breakpoint and at a_function.
        self.expect(
            "thread list",
            STOPPED_DUE_TO_BREAKPOINT,
            substrs=["stopped", "a_function", "stop reason = breakpoint"],
        )

        # The breakpoint should have a hit count of 1.
        lldbutil.check_breakpoint(self, bpno=1, expected_hit_count=1)

        # Issue the 'continue' command.  We should stop again at a_function.
        # The stop reason of the thread should be breakpoint and at a_function.
        self.runCmd("continue")

        # rdar://problem/8508987
        # The a_function breakpoint should be encountered twice.
        self.expect(
            "thread list",
            STOPPED_DUE_TO_BREAKPOINT,
            substrs=["stopped", "a_function", "stop reason = breakpoint"],
        )

        # The breakpoint should have a hit count of 2.
        lldbutil.check_breakpoint(self, bpno=1, expected_hit_count=2)

    def test_step_over_load(self):
        self.setSvr4Support(False)
        self.run_step_over_load()

    def test_step_over_load_with_svr4(self):
        self.setSvr4Support(True)
        self.run_step_over_load()

    def run_step_over_load(self):
        """Test stepping over code that loads a shared library works correctly."""
        self.copy_shlibs_to_remote()

        exe = self.getBuildArtifact("a.out")
        self.runCmd("file " + exe, CURRENT_EXECUTABLE_SET)

        # Break by function name a_function (not yet loaded).
        lldbutil.run_break_set_by_file_and_line(
            self, "main.cpp", self.line, num_expected_locations=1, loc_exact=True
        )

        self.runCmd("run", RUN_SUCCEEDED)

        # The stop reason of the thread should be breakpoint and at a_function.
        self.expect(
            "thread list",
            STOPPED_DUE_TO_BREAKPOINT,
            substrs=["stopped", "stop reason = breakpoint"],
        )

        self.runCmd("thread step-over", "Stepping over function that loads library")

        # The stop reason should be step end.
        self.expect(
            "thread list",
            "step over succeeded.",
            substrs=["stopped", "stop reason = step over"],
        )

    # We can't find a breakpoint location for d_init before launching because
    # executable dependencies are resolved relative to the debuggers PWD. Bug?
    # The remote lldb server resolves the executable dependencies correctly.
    @expectedFailureAll(
        oslist=["freebsd", "linux", "netbsd"],
        remote=False,
    )
    @expectedFailureAll(oslist=["windows"], archs=["aarch64"])
    def test_static_init_during_load(self):
        """Test that we can set breakpoints correctly in static initializers"""
        self.copy_shlibs_to_remote()

        exe = self.getBuildArtifact("a.out")
        self.runCmd("file " + exe, CURRENT_EXECUTABLE_SET)

        a_init_bp_num = lldbutil.run_break_set_by_symbol(
            self, "a_init", num_expected_locations=0
        )
        b_init_bp_num = lldbutil.run_break_set_by_symbol(
            self, "b_init", num_expected_locations=0
        )
        d_init_bp_num = lldbutil.run_break_set_by_symbol(
            self, "d_init", num_expected_locations=1
        )

        self.runCmd("run", RUN_SUCCEEDED)

        self.expect(
            "thread list",
            STOPPED_DUE_TO_BREAKPOINT,
            substrs=[
                "stopped",
                "d_init",
                "stop reason = breakpoint %d" % d_init_bp_num,
            ],
        )

        self.runCmd("continue")
        self.expect(
            "thread list",
            STOPPED_DUE_TO_BREAKPOINT,
            substrs=[
                "stopped",
                "b_init",
                "stop reason = breakpoint %d" % b_init_bp_num,
            ],
        )
        self.expect("thread backtrace", substrs=["b_init", "dylib_open", "main"])

        self.runCmd("continue")
        self.expect(
            "thread list",
            STOPPED_DUE_TO_BREAKPOINT,
            substrs=[
                "stopped",
                "a_init",
                "stop reason = breakpoint %d" % a_init_bp_num,
            ],
        )
        self.expect("thread backtrace", substrs=["a_init", "dylib_open", "main"])
