xref: /llvm-project/lldb/test/API/functionalities/breakpoint/comp_dir_symlink/TestCompDirSymLink.py (revision 2238dcc39358353cac21df75c3c3286ab20b8f53)
199451b44SJordan Rupprecht"""
299451b44SJordan RupprechtTest breakpoint command with AT_comp_dir set to symbolic link.
399451b44SJordan Rupprecht"""
499451b44SJordan Rupprecht
599451b44SJordan Rupprecht
699451b44SJordan Rupprechtimport os
799451b44SJordan Rupprechtimport lldb
899451b44SJordan Rupprechtfrom lldbsuite.test.decorators import *
999451b44SJordan Rupprechtfrom lldbsuite.test.lldbtest import *
1099451b44SJordan Rupprechtfrom lldbsuite.test import lldbutil
1199451b44SJordan Rupprecht
1299451b44SJordan Rupprecht
13*2238dcc3SJonas Devlieghere_EXE_NAME = "CompDirSymLink"  # Must match Makefile
14*2238dcc3SJonas Devlieghere_SRC_FILE = "relative.cpp"
15*2238dcc3SJonas Devlieghere_COMP_DIR_SYM_LINK_PROP = "symbols.debug-info-symlink-paths"
1699451b44SJordan Rupprecht
1799451b44SJordan Rupprecht
1899451b44SJordan Rupprechtclass CompDirSymLinkTestCase(TestBase):
1999451b44SJordan Rupprecht    def setUp(self):
2099451b44SJordan Rupprecht        # Call super's setUp().
2199451b44SJordan Rupprecht        TestBase.setUp(self)
2299451b44SJordan Rupprecht        # Find the line number to break inside main().
2399451b44SJordan Rupprecht        self.line = line_number(
2499451b44SJordan Rupprecht            os.path.join(self.getSourceDir(), "main.cpp"),
25*2238dcc3SJonas Devlieghere            "// Set break point at this line.",
26*2238dcc3SJonas Devlieghere        )
2799451b44SJordan Rupprecht
2899451b44SJordan Rupprecht    @skipIf(hostoslist=["windows"])
2999451b44SJordan Rupprecht    def test_symlink_paths_set(self):
3099451b44SJordan Rupprecht        pwd_symlink = self.create_src_symlink()
3199451b44SJordan Rupprecht        self.doBuild(pwd_symlink, pwd_symlink)
3299451b44SJordan Rupprecht        src_path = self.getBuildArtifact(_SRC_FILE)
3399451b44SJordan Rupprecht        lldbutil.run_break_set_by_file_and_line(self, src_path, self.line)
3499451b44SJordan Rupprecht
3599451b44SJordan Rupprecht    @skipIf(hostoslist=no_match(["linux"]))
3699451b44SJordan Rupprecht    def test_symlink_paths_set_procselfcwd(self):
3799451b44SJordan Rupprecht        os.chdir(self.getBuildDir())
38*2238dcc3SJonas Devlieghere        pwd_symlink = "/proc/self/cwd"
3999451b44SJordan Rupprecht        self.doBuild(pwd_symlink, pwd_symlink)
4099451b44SJordan Rupprecht        src_path = self.getBuildArtifact(_SRC_FILE)
4199451b44SJordan Rupprecht        # /proc/self/cwd points to a realpath form of current directory.
4299451b44SJordan Rupprecht        src_path = os.path.realpath(src_path)
4399451b44SJordan Rupprecht        lldbutil.run_break_set_by_file_and_line(self, src_path, self.line)
4499451b44SJordan Rupprecht
4599451b44SJordan Rupprecht    @skipIf(hostoslist=["windows"])
4699451b44SJordan Rupprecht    def test_symlink_paths_unset(self):
4799451b44SJordan Rupprecht        pwd_symlink = self.create_src_symlink()
4899451b44SJordan Rupprecht        self.doBuild(pwd_symlink, None)
4999451b44SJordan Rupprecht        src_path = self.getBuildArtifact(_SRC_FILE)
5099451b44SJordan Rupprecht        self.assertRaises(
5199451b44SJordan Rupprecht            AssertionError,
5299451b44SJordan Rupprecht            lldbutil.run_break_set_by_file_and_line,
5399451b44SJordan Rupprecht            self,
5499451b44SJordan Rupprecht            src_path,
55*2238dcc3SJonas Devlieghere            self.line,
56*2238dcc3SJonas Devlieghere        )
5799451b44SJordan Rupprecht
5899451b44SJordan Rupprecht    @skipIf(hostoslist=["windows"])
5999451b44SJordan Rupprecht    def test_symlink_paths_empty(self):
6099451b44SJordan Rupprecht        pwd_symlink = self.create_src_symlink()
6199451b44SJordan Rupprecht        self.doBuild(pwd_symlink, "")
6299451b44SJordan Rupprecht        src_path = self.getBuildArtifact(_SRC_FILE)
6399451b44SJordan Rupprecht        self.assertRaises(
6499451b44SJordan Rupprecht            AssertionError,
6599451b44SJordan Rupprecht            lldbutil.run_break_set_by_file_and_line,
6699451b44SJordan Rupprecht            self,
6799451b44SJordan Rupprecht            src_path,
68*2238dcc3SJonas Devlieghere            self.line,
69*2238dcc3SJonas Devlieghere        )
7099451b44SJordan Rupprecht
7199451b44SJordan Rupprecht    def create_src_symlink(self):
72*2238dcc3SJonas Devlieghere        pwd_symlink = self.getBuildArtifact("pwd_symlink")
7399451b44SJordan Rupprecht        if os.path.exists(pwd_symlink):
7499451b44SJordan Rupprecht            os.unlink(pwd_symlink)
7599451b44SJordan Rupprecht        os.symlink(self.getBuildDir(), pwd_symlink)
7699451b44SJordan Rupprecht        self.addTearDownHook(lambda: os.remove(pwd_symlink))
7799451b44SJordan Rupprecht        return pwd_symlink
7899451b44SJordan Rupprecht
7999451b44SJordan Rupprecht    def doBuild(self, pwd_symlink, setting_value):
80*2238dcc3SJonas Devlieghere        self.build(dictionary={"PWD": pwd_symlink})
8199451b44SJordan Rupprecht
8299451b44SJordan Rupprecht        if setting_value:
8399451b44SJordan Rupprecht            cmd = "settings set %s '%s'" % (_COMP_DIR_SYM_LINK_PROP, setting_value)
8499451b44SJordan Rupprecht        else:
8599451b44SJordan Rupprecht            cmd = "settings clear %s" % _COMP_DIR_SYM_LINK_PROP
8699451b44SJordan Rupprecht        self.runCmd(cmd)
8799451b44SJordan Rupprecht
8899451b44SJordan Rupprecht        exe = self.getBuildArtifact(_EXE_NAME)
89*2238dcc3SJonas Devlieghere        self.runCmd("file " + exe, CURRENT_EXECUTABLE_SET)
90