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