199451b44SJordan Rupprechtimport lldb
299451b44SJordan Rupprechtfrom lldbsuite.test.decorators import *
399451b44SJordan Rupprechtimport lldbsuite.test.lldbtest as lldbtest
499451b44SJordan Rupprechtimport lldbsuite.test.lldbutil as lldbutil
599451b44SJordan Rupprechtimport os
699451b44SJordan Rupprechtimport unittest2
799451b44SJordan Rupprecht
899451b44SJordan Rupprecht
999451b44SJordan Rupprechtclass TestDSYMSourcePathRemapping(lldbtest.TestBase):
1099451b44SJordan Rupprecht
1199451b44SJordan Rupprecht    def build(self):
1299451b44SJordan Rupprecht        botdir = self.getBuildArtifact('buildbot')
1399451b44SJordan Rupprecht        userdir = self.getBuildArtifact('user')
1499451b44SJordan Rupprecht        inputs = self.getSourcePath('Inputs')
1599451b44SJordan Rupprecht        lldbutil.mkdir_p(botdir)
1699451b44SJordan Rupprecht        lldbutil.mkdir_p(userdir)
1799451b44SJordan Rupprecht        import shutil
1899451b44SJordan Rupprecht        for f in ['main.c', 'relative.c']:
1999451b44SJordan Rupprecht            shutil.copyfile(os.path.join(inputs, f), os.path.join(botdir, f))
2099451b44SJordan Rupprecht            shutil.copyfile(os.path.join(inputs, f), os.path.join(userdir, f))
2199451b44SJordan Rupprecht
2299451b44SJordan Rupprecht        super(TestDSYMSourcePathRemapping, self).build()
2399451b44SJordan Rupprecht
2499451b44SJordan Rupprecht        # Remove the build sources.
2599451b44SJordan Rupprecht        self.assertTrue(os.path.isdir(botdir))
2699451b44SJordan Rupprecht        shutil.rmtree(botdir)
2799451b44SJordan Rupprecht
2899451b44SJordan Rupprecht        # Create a plist.
2999451b44SJordan Rupprecht        import subprocess
3099451b44SJordan Rupprecht        dsym = self.getBuildArtifact('a.out.dSYM')
3199451b44SJordan Rupprecht        uuid = subprocess.check_output(["/usr/bin/dwarfdump", "--uuid", dsym]
3299451b44SJordan Rupprecht                                      ).decode("utf-8").split(" ")[1]
3399451b44SJordan Rupprecht        import re
3499451b44SJordan Rupprecht        self.assertTrue(re.match(r'[0-9a-fA-F-]+', uuid))
3599451b44SJordan Rupprecht        plist = os.path.join(dsym, 'Contents', 'Resources', uuid + '.plist')
3699451b44SJordan Rupprecht        with open(plist, 'w') as f:
3799451b44SJordan Rupprecht            f.write('<?xml version="1.0" encoding="UTF-8"?>\n')
3899451b44SJordan Rupprecht            f.write('<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">\n')
3999451b44SJordan Rupprecht            f.write('<plist version="1.0">\n')
4099451b44SJordan Rupprecht            f.write('<dict>\n')
4199451b44SJordan Rupprecht            f.write('  <key>DBGSourcePathRemapping</key>\n')
4299451b44SJordan Rupprecht            f.write('  <dict>\n')
43*06ea05a3SFred Riss            f.write('    <key>' + os.path.realpath(botdir) + '</key>\n')
4499451b44SJordan Rupprecht            f.write('    <string>' + userdir + '</string>\n')
4599451b44SJordan Rupprecht            f.write('  </dict>\n')
4699451b44SJordan Rupprecht            f.write('</dict>\n')
4799451b44SJordan Rupprecht            f.write('</plist>\n')
4899451b44SJordan Rupprecht
4999451b44SJordan Rupprecht
5099451b44SJordan Rupprecht    @skipIf(debug_info=no_match("dsym"))
5199451b44SJordan Rupprecht    def test(self):
5299451b44SJordan Rupprecht        self.build()
5399451b44SJordan Rupprecht
5499451b44SJordan Rupprecht        target, process, _, _ = lldbutil.run_to_name_breakpoint(
5599451b44SJordan Rupprecht            self, 'main')
5699451b44SJordan Rupprecht        self.expect("source list -n main", substrs=["Hello Absolute"])
5799451b44SJordan Rupprecht        bkpt = target.BreakpointCreateByName('relative')
5899451b44SJordan Rupprecht        lldbutil.continue_to_breakpoint(process, bkpt)
5999451b44SJordan Rupprecht        self.expect("source list -n relative", substrs=["Hello Relative"])
60