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