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


class TestCase(TestBase):
    @skipIfRemote
    @no_debug_info_test
    @skipIf(archs=no_match(["x86_64", "arm64$"]))
    # glibc's dlopen doesn't support opening executables.
    # https://sourceware.org/bugzilla/show_bug.cgi?id=11754
    @skipUnlessDarwin
    def test(self):
        self.build()
        # Launch and stop before the dlopen call.
        lldbutil.run_to_source_breakpoint(
            self, "// break here", lldb.SBFileSpec("main.c")
        )

        # Delete the breakpoint we no longer need.
        self.target().DeleteAllBreakpoints()

        # Check that the executable is the test binary.
        self.assertEqual(self.target().GetExecutable().GetFilename(), "a.out")

        # Continue so that dlopen is called.
        breakpoint = self.target().BreakpointCreateBySourceRegex(
            "// break after dlopen", lldb.SBFileSpec("main.c")
        )
        self.assertNotEqual(breakpoint.GetNumResolvedLocations(), 0)
        stopped_threads = lldbutil.continue_to_breakpoint(self.process(), breakpoint)
        self.assertEqual(len(stopped_threads), 1)

        # Check that the executable is still the test binary and not "other".
        self.assertEqual(self.target().GetExecutable().GetFilename(), "a.out")

        # Kill the process and run the program again.
        err = self.process().Kill()
        self.assertSuccess(err)

        # Test that we hit the breakpoint after dlopen.
        lldbutil.run_to_breakpoint_do_run(self, self.target(), breakpoint)
