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