xref: /llvm-project/lldb/test/API/macosx/DBGSourcePathRemapping/TestDSYMSourcePathRemapping.py (revision 2238dcc39358353cac21df75c3c3286ab20b8f53)
1import lldb
2from lldbsuite.test.decorators import *
3import lldbsuite.test.lldbtest as lldbtest
4import lldbsuite.test.lldbutil as lldbutil
5import os
6
7
8class TestDSYMSourcePathRemapping(lldbtest.TestBase):
9    def build(self):
10        botdir = self.getBuildArtifact("buildbot")
11        userdir = self.getBuildArtifact("user")
12        inputs = self.getSourcePath("Inputs")
13        lldbutil.mkdir_p(botdir)
14        lldbutil.mkdir_p(userdir)
15        import shutil
16
17        for f in ["main.c", "relative.c"]:
18            shutil.copyfile(os.path.join(inputs, f), os.path.join(botdir, f))
19            shutil.copyfile(os.path.join(inputs, f), os.path.join(userdir, f))
20
21        super(TestDSYMSourcePathRemapping, self).build()
22
23        # Remove the build sources.
24        self.assertTrue(os.path.isdir(botdir))
25        shutil.rmtree(botdir)
26
27        # Create a plist.
28        import subprocess
29
30        dsym = self.getBuildArtifact("a.out.dSYM")
31        uuid = (
32            subprocess.check_output(["/usr/bin/dwarfdump", "--uuid", dsym])
33            .decode("utf-8")
34            .split(" ")[1]
35        )
36        import re
37
38        self.assertTrue(re.match(r"[0-9a-fA-F-]+", uuid))
39        plist = os.path.join(dsym, "Contents", "Resources", uuid + ".plist")
40        with open(plist, "w") as f:
41            f.write('<?xml version="1.0" encoding="UTF-8"?>\n')
42            f.write(
43                '<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">\n'
44            )
45            f.write('<plist version="1.0">\n')
46            f.write("<dict>\n")
47            f.write("  <key>DBGSourcePathRemapping</key>\n")
48            f.write("  <dict>\n")
49            f.write("    <key>" + os.path.realpath(botdir) + "</key>\n")
50            f.write("    <string>" + userdir + "</string>\n")
51            f.write("  </dict>\n")
52            f.write("</dict>\n")
53            f.write("</plist>\n")
54
55    @skipIf(debug_info=no_match("dsym"))
56    def test(self):
57        self.build()
58
59        target, process, _, _ = lldbutil.run_to_name_breakpoint(self, "main")
60        self.expect("source list -n main", substrs=["Hello Absolute"])
61        bkpt = target.BreakpointCreateByName("relative")
62        lldbutil.continue_to_breakpoint(process, bkpt)
63        self.expect("source list -n relative", substrs=["Hello Relative"])
64