xref: /llvm-project/lldb/test/API/functionalities/source-map/TestTargetSourceMap.py (revision 80fcecb13c388ff087a27a4b0e7ca3dd8c98eaa4)
199451b44SJordan Rupprechtimport lldb
299451b44SJordan Rupprechtfrom lldbsuite.test.lldbtest import *
399451b44SJordan Rupprechtfrom lldbsuite.test.decorators import *
4d5f54751SJeffrey Tanimport json
530350c25SWalter Erquinigoimport os
699451b44SJordan Rupprecht
799451b44SJordan Rupprecht
899451b44SJordan Rupprechtclass TestTargetSourceMap(TestBase):
999451b44SJordan Rupprecht    @no_debug_info_test
10d5f54751SJeffrey Tan    def test_source_map_via_setting_api(self):
11d5f54751SJeffrey Tan        """
12d5f54751SJeffrey Tan        Test that ensures SBDebugger::GetSetting("target.source-map") API
13d5f54751SJeffrey Tan        can correctly fetch source mapping entries.
14d5f54751SJeffrey Tan        """
15d5f54751SJeffrey Tan        # Set the target soure map to map "./" to the current test directory
16d5f54751SJeffrey Tan        src_dir = self.getSourceDir()
17d5f54751SJeffrey Tan
18d5f54751SJeffrey Tan        source_map_setting_path = "target.source-map"
19d5f54751SJeffrey Tan        initial_source_map = self.dbg.GetSetting(source_map_setting_path)
20*80fcecb1SJonas Devlieghere        self.assertEqual(
212238dcc3SJonas Devlieghere            initial_source_map.GetSize(), 0, "Initial source map should be empty"
222238dcc3SJonas Devlieghere        )
23d5f54751SJeffrey Tan
24d5f54751SJeffrey Tan        src_dir = self.getSourceDir()
25d5f54751SJeffrey Tan        self.runCmd('settings set %s . "%s"' % (source_map_setting_path, src_dir))
26d5f54751SJeffrey Tan
27d5f54751SJeffrey Tan        source_map = self.dbg.GetSetting(source_map_setting_path)
28*80fcecb1SJonas Devlieghere        self.assertEqual(
292238dcc3SJonas Devlieghere            source_map.GetSize(), 1, "source map should be have one appended entry"
302238dcc3SJonas Devlieghere        )
31d5f54751SJeffrey Tan
32d5f54751SJeffrey Tan        stream = lldb.SBStream()
33d5f54751SJeffrey Tan        source_map.GetAsJSON(stream)
34d5f54751SJeffrey Tan        serialized_source_map = json.loads(stream.GetData())
35d5f54751SJeffrey Tan
36*80fcecb1SJonas Devlieghere        self.assertEqual(
372238dcc3SJonas Devlieghere            len(serialized_source_map[0]), 2, "source map entry should have two parts"
382238dcc3SJonas Devlieghere        )
39*80fcecb1SJonas Devlieghere        self.assertEqual(
402238dcc3SJonas Devlieghere            serialized_source_map[0][0],
412238dcc3SJonas Devlieghere            ".",
422238dcc3SJonas Devlieghere            "source map entry's first part does not match",
432238dcc3SJonas Devlieghere        )
44*80fcecb1SJonas Devlieghere        self.assertEqual(
452238dcc3SJonas Devlieghere            serialized_source_map[0][1],
462238dcc3SJonas Devlieghere            src_dir,
472238dcc3SJonas Devlieghere            "source map entry's second part does not match",
482238dcc3SJonas Devlieghere        )
49d5f54751SJeffrey Tan
50d5f54751SJeffrey Tan    @no_debug_info_test
5199451b44SJordan Rupprecht    def test_source_map(self):
5299451b44SJordan Rupprecht        """Test target.source-map' functionality."""
5330350c25SWalter Erquinigo
5430350c25SWalter Erquinigo        def assertBreakpointWithSourceMap(src_path):
5530350c25SWalter Erquinigo            # Set a breakpoint after we remap source and verify that it succeeds
5630350c25SWalter Erquinigo            bp = target.BreakpointCreateByLocation(src_path, 2)
57*80fcecb1SJonas Devlieghere            self.assertEqual(
582238dcc3SJonas Devlieghere                bp.GetNumLocations(), 1, "make sure breakpoint was resolved with map"
592238dcc3SJonas Devlieghere            )
6030350c25SWalter Erquinigo
6130350c25SWalter Erquinigo            # Now make sure that we can actually FIND the source file using this
6230350c25SWalter Erquinigo            # remapping:
6330350c25SWalter Erquinigo            retval = lldb.SBCommandReturnObject()
642238dcc3SJonas Devlieghere            self.dbg.GetCommandInterpreter().HandleCommand(
652238dcc3SJonas Devlieghere                "source list -f main.c -l 2", retval
662238dcc3SJonas Devlieghere            )
6730350c25SWalter Erquinigo            self.assertTrue(retval.Succeeded(), "source list didn't succeed.")
682238dcc3SJonas Devlieghere            self.assertNotEqual(
692238dcc3SJonas Devlieghere                retval.GetOutput(), None, "We got no ouput from source list"
702238dcc3SJonas Devlieghere            )
712238dcc3SJonas Devlieghere            self.assertIn(
722238dcc3SJonas Devlieghere                "return", retval.GetOutput(), "We didn't find the source file..."
732238dcc3SJonas Devlieghere            )
7430350c25SWalter Erquinigo
7599451b44SJordan Rupprecht        # Set the target soure map to map "./" to the current test directory
7699451b44SJordan Rupprecht        src_dir = self.getSourceDir()
7799451b44SJordan Rupprecht        src_path = os.path.join(src_dir, "main.c")
7899451b44SJordan Rupprecht        yaml_path = os.path.join(src_dir, "a.yaml")
7999451b44SJordan Rupprecht        yaml_base, ext = os.path.splitext(yaml_path)
8099451b44SJordan Rupprecht        obj_path = self.getBuildArtifact("main.o")
8199451b44SJordan Rupprecht        self.yaml2obj(yaml_path, obj_path)
8299451b44SJordan Rupprecht
8399451b44SJordan Rupprecht        # Create a target with the object file we just created from YAML
8499451b44SJordan Rupprecht        target = self.dbg.CreateTarget(obj_path)
8599451b44SJordan Rupprecht
8699451b44SJordan Rupprecht        # Set a breakpoint before we remap source and verify that it fails
8799451b44SJordan Rupprecht        bp = target.BreakpointCreateByLocation(src_path, 2)
88*80fcecb1SJonas Devlieghere        self.assertEqual(
892238dcc3SJonas Devlieghere            bp.GetNumLocations(),
902238dcc3SJonas Devlieghere            0,
912238dcc3SJonas Devlieghere            "make sure no breakpoints were resolved without map",
922238dcc3SJonas Devlieghere        )
9399451b44SJordan Rupprecht
94ca47ac3dSWalter Erquinigo        valid_path = os.path.dirname(src_dir)
95ca47ac3dSWalter Erquinigo        valid_path2 = os.path.dirname(valid_path)
9630350c25SWalter Erquinigo        invalid_path = src_dir + "invalid_path"
9730350c25SWalter Erquinigo        invalid_path2 = src_dir + "invalid_path2"
9899451b44SJordan Rupprecht
9930350c25SWalter Erquinigo        # We make sure the error message contains all the invalid paths
10030350c25SWalter Erquinigo        self.expect(
1012238dcc3SJonas Devlieghere            'settings set target.source-map . "%s" . "%s" . "%s" . "%s'
102ca47ac3dSWalter Erquinigo            % (invalid_path, src_dir, invalid_path2, valid_path),
10330350c25SWalter Erquinigo            substrs=[
104ca47ac3dSWalter Erquinigo                'error: the replacement path doesn\'t exist: "%s"' % (invalid_path),
10530350c25SWalter Erquinigo                'the replacement path doesn\'t exist: "%s"' % (invalid_path2),
10630350c25SWalter Erquinigo            ],
10730350c25SWalter Erquinigo            error=True,
10830350c25SWalter Erquinigo        )
10930350c25SWalter Erquinigo        self.expect(
1102238dcc3SJonas Devlieghere            "settings show target.source-map",
111ca47ac3dSWalter Erquinigo            substrs=[
112ca47ac3dSWalter Erquinigo                '[0] "." -> "%s"' % (src_dir),
113ca47ac3dSWalter Erquinigo                '[1] "." -> "%s"' % (valid_path),
114ca47ac3dSWalter Erquinigo            ],
11530350c25SWalter Erquinigo        )
11630350c25SWalter Erquinigo        assertBreakpointWithSourceMap(src_path)
11799451b44SJordan Rupprecht
118ca47ac3dSWalter Erquinigo        # Attempts to replace an index to an invalid mapping should have no effect.
119ca47ac3dSWalter Erquinigo        # Modifications to valid mappings should work.
12030350c25SWalter Erquinigo        self.expect(
1212238dcc3SJonas Devlieghere            'settings replace target.source-map 0 . "%s" . "%s"'
1222238dcc3SJonas Devlieghere            % (invalid_path, valid_path2),
123ca47ac3dSWalter Erquinigo            substrs=[
124ca47ac3dSWalter Erquinigo                'error: the replacement path doesn\'t exist: "%s"' % (invalid_path),
125ca47ac3dSWalter Erquinigo            ],
12630350c25SWalter Erquinigo            error=True,
12730350c25SWalter Erquinigo        )
12830350c25SWalter Erquinigo        self.expect(
1292238dcc3SJonas Devlieghere            "settings show target.source-map",
130ca47ac3dSWalter Erquinigo            substrs=[
131ca47ac3dSWalter Erquinigo                '[0] "." -> "%s"' % (src_dir),
132ca47ac3dSWalter Erquinigo                '[1] "." -> "%s"' % (valid_path2),
1332238dcc3SJonas Devlieghere            ],
13430350c25SWalter Erquinigo        )
13530350c25SWalter Erquinigo        assertBreakpointWithSourceMap(src_path)
13630350c25SWalter Erquinigo
137ca47ac3dSWalter Erquinigo        # Let's clear and add the mapping back with insert-after
1382238dcc3SJonas Devlieghere        self.runCmd("settings remove target.source-map 0")
13930350c25SWalter Erquinigo        self.expect(
1402238dcc3SJonas Devlieghere            "settings show target.source-map",
141ca47ac3dSWalter Erquinigo            substrs=['[0] "." -> "%s"' % (valid_path2)],
14230350c25SWalter Erquinigo        )
14330350c25SWalter Erquinigo
14430350c25SWalter Erquinigo        self.expect(
1452238dcc3SJonas Devlieghere            'settings insert-after target.source-map 0 . "%s" . "%s" . "%s"'
146ca47ac3dSWalter Erquinigo            % (invalid_path, invalid_path2, src_dir),
147ca47ac3dSWalter Erquinigo            substrs=[
148ca47ac3dSWalter Erquinigo                'error: the replacement path doesn\'t exist: "%s"' % (invalid_path),
149ca47ac3dSWalter Erquinigo                'the replacement path doesn\'t exist: "%s"' % (invalid_path2),
150ca47ac3dSWalter Erquinigo            ],
15130350c25SWalter Erquinigo            error=True,
15230350c25SWalter Erquinigo        )
15330350c25SWalter Erquinigo        self.expect(
1542238dcc3SJonas Devlieghere            "settings show target.source-map",
155ca47ac3dSWalter Erquinigo            substrs=[
156ca47ac3dSWalter Erquinigo                '[0] "." -> "%s"' % (valid_path2),
157ca47ac3dSWalter Erquinigo                '[1] "." -> "%s"' % (src_dir),
1582238dcc3SJonas Devlieghere            ],
15930350c25SWalter Erquinigo        )
16030350c25SWalter Erquinigo
161ca47ac3dSWalter Erquinigo        # Let's clear using remove and add the mapping in with append
1622238dcc3SJonas Devlieghere        self.runCmd("settings remove target.source-map 1")
16330350c25SWalter Erquinigo        self.expect(
1642238dcc3SJonas Devlieghere            "settings show target.source-map",
165ca47ac3dSWalter Erquinigo            substrs=[
166ca47ac3dSWalter Erquinigo                '[0] "." -> "%s"' % (valid_path2),
1672238dcc3SJonas Devlieghere            ],
16830350c25SWalter Erquinigo        )
1692238dcc3SJonas Devlieghere        self.runCmd("settings clear target.source-map")
17030350c25SWalter Erquinigo        self.expect(
1712238dcc3SJonas Devlieghere            'settings append target.source-map . "%s" . "%s" . "%s"'
1722238dcc3SJonas Devlieghere            % (invalid_path, src_dir, invalid_path2),
173ca47ac3dSWalter Erquinigo            substrs=[
174ca47ac3dSWalter Erquinigo                'error: the replacement path doesn\'t exist: "%s"' % (invalid_path),
175ca47ac3dSWalter Erquinigo                'the replacement path doesn\'t exist: "%s"' % (invalid_path2),
176ca47ac3dSWalter Erquinigo            ],
17730350c25SWalter Erquinigo            error=True,
17830350c25SWalter Erquinigo        )
179ca47ac3dSWalter Erquinigo        self.expect(
1802238dcc3SJonas Devlieghere            "settings show target.source-map",
181ca47ac3dSWalter Erquinigo            substrs=[
182ca47ac3dSWalter Erquinigo                '[0] "." -> "%s"' % (src_dir),
1832238dcc3SJonas Devlieghere            ],
184ca47ac3dSWalter Erquinigo        )
18530350c25SWalter Erquinigo        assertBreakpointWithSourceMap(src_path)
186