186 lines · python
1import lldb2from lldbsuite.test.lldbtest import *3from lldbsuite.test.decorators import *4import json5import os6 7 8class TestTargetSourceMap(TestBase):9 @no_debug_info_test10 def test_source_map_via_setting_api(self):11 """12 Test that ensures SBDebugger::GetSetting("target.source-map") API13 can correctly fetch source mapping entries.14 """15 # Set the target soure map to map "./" to the current test directory16 src_dir = self.getSourceDir()17 18 source_map_setting_path = "target.source-map"19 initial_source_map = self.dbg.GetSetting(source_map_setting_path)20 self.assertEqual(21 initial_source_map.GetSize(), 0, "Initial source map should be empty"22 )23 24 src_dir = self.getSourceDir()25 self.runCmd('settings set %s . "%s"' % (source_map_setting_path, src_dir))26 27 source_map = self.dbg.GetSetting(source_map_setting_path)28 self.assertEqual(29 source_map.GetSize(), 1, "source map should be have one appended entry"30 )31 32 stream = lldb.SBStream()33 source_map.GetAsJSON(stream)34 serialized_source_map = json.loads(stream.GetData())35 36 self.assertEqual(37 len(serialized_source_map[0]), 2, "source map entry should have two parts"38 )39 self.assertEqual(40 serialized_source_map[0][0],41 ".",42 "source map entry's first part does not match",43 )44 self.assertEqual(45 serialized_source_map[0][1],46 src_dir,47 "source map entry's second part does not match",48 )49 50 @no_debug_info_test51 def test_source_map(self):52 """Test target.source-map' functionality."""53 54 def assertBreakpointWithSourceMap(src_path):55 # Set a breakpoint after we remap source and verify that it succeeds56 bp = target.BreakpointCreateByLocation(src_path, 2)57 self.assertEqual(58 bp.GetNumLocations(), 1, "make sure breakpoint was resolved with map"59 )60 61 # Now make sure that we can actually FIND the source file using this62 # remapping:63 retval = lldb.SBCommandReturnObject()64 self.dbg.GetCommandInterpreter().HandleCommand(65 "source list -f main.c -l 2", retval66 )67 self.assertTrue(retval.Succeeded(), "source list didn't succeed.")68 self.assertNotEqual(69 retval.GetOutput(), None, "We got no ouput from source list"70 )71 self.assertIn(72 "return", retval.GetOutput(), "We didn't find the source file..."73 )74 75 # Set the target soure map to map "./" to the current test directory76 src_dir = self.getSourceDir()77 src_path = os.path.join(src_dir, "main.c")78 yaml_path = os.path.join(src_dir, "a.yaml")79 yaml_base, ext = os.path.splitext(yaml_path)80 obj_path = self.getBuildArtifact("main.o")81 self.yaml2obj(yaml_path, obj_path)82 83 # Create a target with the object file we just created from YAML84 target = self.dbg.CreateTarget(obj_path)85 86 # Set a breakpoint before we remap source and verify that it fails87 bp = target.BreakpointCreateByLocation(src_path, 2)88 self.assertEqual(89 bp.GetNumLocations(),90 0,91 "make sure no breakpoints were resolved without map",92 )93 94 valid_path = os.path.dirname(src_dir)95 valid_path2 = os.path.dirname(valid_path)96 invalid_path = src_dir + "invalid_path"97 invalid_path2 = src_dir + "invalid_path2"98 99 # We make sure the error message contains all the invalid paths100 self.expect(101 'settings set target.source-map . "%s" . "%s" . "%s" . "%s'102 % (invalid_path, src_dir, invalid_path2, valid_path),103 substrs=[104 'error: the replacement path doesn\'t exist: "%s"' % (invalid_path),105 'the replacement path doesn\'t exist: "%s"' % (invalid_path2),106 ],107 error=True,108 )109 self.expect(110 "settings show target.source-map",111 substrs=[112 '[0] "." -> "%s"' % (src_dir),113 '[1] "." -> "%s"' % (valid_path),114 ],115 )116 assertBreakpointWithSourceMap(src_path)117 118 # Attempts to replace an index to an invalid mapping should have no effect.119 # Modifications to valid mappings should work.120 self.expect(121 'settings replace target.source-map 0 . "%s" . "%s"'122 % (invalid_path, valid_path2),123 substrs=[124 'error: the replacement path doesn\'t exist: "%s"' % (invalid_path),125 ],126 error=True,127 )128 self.expect(129 "settings show target.source-map",130 substrs=[131 '[0] "." -> "%s"' % (src_dir),132 '[1] "." -> "%s"' % (valid_path2),133 ],134 )135 assertBreakpointWithSourceMap(src_path)136 137 # Let's clear and add the mapping back with insert-after138 self.runCmd("settings remove target.source-map 0")139 self.expect(140 "settings show target.source-map",141 substrs=['[0] "." -> "%s"' % (valid_path2)],142 )143 144 self.expect(145 'settings insert-after target.source-map 0 . "%s" . "%s" . "%s"'146 % (invalid_path, invalid_path2, src_dir),147 substrs=[148 'error: the replacement path doesn\'t exist: "%s"' % (invalid_path),149 'the replacement path doesn\'t exist: "%s"' % (invalid_path2),150 ],151 error=True,152 )153 self.expect(154 "settings show target.source-map",155 substrs=[156 '[0] "." -> "%s"' % (valid_path2),157 '[1] "." -> "%s"' % (src_dir),158 ],159 )160 161 # Let's clear using remove and add the mapping in with append162 self.runCmd("settings remove target.source-map 1")163 self.expect(164 "settings show target.source-map",165 substrs=[166 '[0] "." -> "%s"' % (valid_path2),167 ],168 )169 self.runCmd("settings clear target.source-map")170 self.expect(171 'settings append target.source-map . "%s" . "%s" . "%s"'172 % (invalid_path, src_dir, invalid_path2),173 substrs=[174 'error: the replacement path doesn\'t exist: "%s"' % (invalid_path),175 'the replacement path doesn\'t exist: "%s"' % (invalid_path2),176 ],177 error=True,178 )179 self.expect(180 "settings show target.source-map",181 substrs=[182 '[0] "." -> "%s"' % (src_dir),183 ],184 )185 assertBreakpointWithSourceMap(src_path)186