199451b44SJordan Rupprechtimport lldb
299451b44SJordan Rupprechtfrom lldbsuite.test.lldbtest import *
399451b44SJordan Rupprechtfrom lldbsuite.test.decorators import *
430350c25SWalter Erquinigoimport os
599451b44SJordan Rupprecht
699451b44SJordan Rupprecht
799451b44SJordan Rupprechtclass TestTargetSourceMap(TestBase):
899451b44SJordan Rupprecht
999451b44SJordan Rupprecht    mydir = TestBase.compute_mydir(__file__)
1099451b44SJordan Rupprecht
1199451b44SJordan Rupprecht    @no_debug_info_test
1299451b44SJordan Rupprecht    def test_source_map(self):
1399451b44SJordan Rupprecht        """Test target.source-map' functionality."""
1430350c25SWalter Erquinigo
1530350c25SWalter Erquinigo        def assertBreakpointWithSourceMap(src_path):
1630350c25SWalter Erquinigo            # Set a breakpoint after we remap source and verify that it succeeds
1730350c25SWalter Erquinigo            bp = target.BreakpointCreateByLocation(src_path, 2)
1830350c25SWalter Erquinigo            self.assertEquals(bp.GetNumLocations(), 1,
1930350c25SWalter Erquinigo                            "make sure breakpoint was resolved with map")
2030350c25SWalter Erquinigo
2130350c25SWalter Erquinigo            # Now make sure that we can actually FIND the source file using this
2230350c25SWalter Erquinigo            # remapping:
2330350c25SWalter Erquinigo            retval = lldb.SBCommandReturnObject()
2430350c25SWalter Erquinigo            self.dbg.GetCommandInterpreter().HandleCommand("source list -f main.c -l 2", retval)
2530350c25SWalter Erquinigo            self.assertTrue(retval.Succeeded(), "source list didn't succeed.")
2630350c25SWalter Erquinigo            self.assertNotEqual(retval.GetOutput(), None, "We got no ouput from source list")
27*3cc37622SDave Lee            self.assertIn("return", retval.GetOutput(), "We didn't find the source file...")
2830350c25SWalter Erquinigo
2999451b44SJordan Rupprecht        # Set the target soure map to map "./" to the current test directory
3099451b44SJordan Rupprecht        src_dir = self.getSourceDir()
3199451b44SJordan Rupprecht        src_path = os.path.join(src_dir, "main.c")
3299451b44SJordan Rupprecht        yaml_path = os.path.join(src_dir, "a.yaml")
3399451b44SJordan Rupprecht        yaml_base, ext = os.path.splitext(yaml_path)
3499451b44SJordan Rupprecht        obj_path = self.getBuildArtifact("main.o")
3599451b44SJordan Rupprecht        self.yaml2obj(yaml_path, obj_path)
3699451b44SJordan Rupprecht
3799451b44SJordan Rupprecht        # Create a target with the object file we just created from YAML
3899451b44SJordan Rupprecht        target = self.dbg.CreateTarget(obj_path)
3999451b44SJordan Rupprecht
4099451b44SJordan Rupprecht        # Set a breakpoint before we remap source and verify that it fails
4199451b44SJordan Rupprecht        bp = target.BreakpointCreateByLocation(src_path, 2)
42b3a0c4d7SRaphael Isemann        self.assertEquals(bp.GetNumLocations(), 0,
4399451b44SJordan Rupprecht                        "make sure no breakpoints were resolved without map")
4499451b44SJordan Rupprecht
45ca47ac3dSWalter Erquinigo        valid_path = os.path.dirname(src_dir)
46ca47ac3dSWalter Erquinigo        valid_path2 = os.path.dirname(valid_path)
4730350c25SWalter Erquinigo        invalid_path = src_dir + "invalid_path"
4830350c25SWalter Erquinigo        invalid_path2 = src_dir + "invalid_path2"
4999451b44SJordan Rupprecht
5030350c25SWalter Erquinigo        # We make sure the error message contains all the invalid paths
5130350c25SWalter Erquinigo        self.expect(
52ca47ac3dSWalter Erquinigo            'settings set target.source-map . "%s" . "%s" . "%s" . "%s' \
53ca47ac3dSWalter Erquinigo                % (invalid_path, src_dir, invalid_path2, valid_path),
5430350c25SWalter Erquinigo            substrs=[
55ca47ac3dSWalter Erquinigo                'error: the replacement path doesn\'t exist: "%s"' % (invalid_path),
5630350c25SWalter Erquinigo                'the replacement path doesn\'t exist: "%s"' % (invalid_path2),
5730350c25SWalter Erquinigo            ],
5830350c25SWalter Erquinigo            error=True,
5930350c25SWalter Erquinigo        )
6030350c25SWalter Erquinigo        self.expect(
6130350c25SWalter Erquinigo            'settings show target.source-map',
62ca47ac3dSWalter Erquinigo            substrs=[
63ca47ac3dSWalter Erquinigo                '[0] "." -> "%s"' % (src_dir),
64ca47ac3dSWalter Erquinigo                '[1] "." -> "%s"' % (valid_path),
65ca47ac3dSWalter Erquinigo            ],
6630350c25SWalter Erquinigo        )
6730350c25SWalter Erquinigo        assertBreakpointWithSourceMap(src_path)
6899451b44SJordan Rupprecht
69ca47ac3dSWalter Erquinigo        # Attempts to replace an index to an invalid mapping should have no effect.
70ca47ac3dSWalter Erquinigo        # Modifications to valid mappings should work.
7130350c25SWalter Erquinigo        self.expect(
72ca47ac3dSWalter Erquinigo            'settings replace target.source-map 0 . "%s" . "%s"' % (invalid_path, valid_path2),
73ca47ac3dSWalter Erquinigo            substrs=[
74ca47ac3dSWalter Erquinigo                'error: the replacement path doesn\'t exist: "%s"' % (invalid_path),
75ca47ac3dSWalter Erquinigo            ],
7630350c25SWalter Erquinigo            error=True,
7730350c25SWalter Erquinigo        )
7830350c25SWalter Erquinigo        self.expect(
7930350c25SWalter Erquinigo            'settings show target.source-map',
80ca47ac3dSWalter Erquinigo            substrs=[
81ca47ac3dSWalter Erquinigo                '[0] "." -> "%s"' % (src_dir),
82ca47ac3dSWalter Erquinigo                '[1] "." -> "%s"' % (valid_path2),
83ca47ac3dSWalter Erquinigo            ]
8430350c25SWalter Erquinigo        )
8530350c25SWalter Erquinigo        assertBreakpointWithSourceMap(src_path)
8630350c25SWalter Erquinigo
87ca47ac3dSWalter Erquinigo        # Let's clear and add the mapping back with insert-after
8830350c25SWalter Erquinigo        self.runCmd('settings remove target.source-map 0')
8930350c25SWalter Erquinigo        self.expect(
9030350c25SWalter Erquinigo            'settings show target.source-map',
91ca47ac3dSWalter Erquinigo            substrs=['[0] "." -> "%s"' % (valid_path2)],
9230350c25SWalter Erquinigo        )
9330350c25SWalter Erquinigo
9430350c25SWalter Erquinigo        self.expect(
95ca47ac3dSWalter Erquinigo            'settings insert-after target.source-map 0 . "%s" . "%s" . "%s"' \
96ca47ac3dSWalter Erquinigo                % (invalid_path, invalid_path2, src_dir),
97ca47ac3dSWalter Erquinigo            substrs=[
98ca47ac3dSWalter Erquinigo                'error: the replacement path doesn\'t exist: "%s"' % (invalid_path),
99ca47ac3dSWalter Erquinigo                'the replacement path doesn\'t exist: "%s"' % (invalid_path2),
100ca47ac3dSWalter Erquinigo            ],
10130350c25SWalter Erquinigo            error=True,
10230350c25SWalter Erquinigo        )
10330350c25SWalter Erquinigo        self.expect(
10430350c25SWalter Erquinigo            'settings show target.source-map',
105ca47ac3dSWalter Erquinigo            substrs=[
106ca47ac3dSWalter Erquinigo                '[0] "." -> "%s"' % (valid_path2),
107ca47ac3dSWalter Erquinigo                '[1] "." -> "%s"' % (src_dir),
108ca47ac3dSWalter Erquinigo            ]
10930350c25SWalter Erquinigo        )
11030350c25SWalter Erquinigo
111ca47ac3dSWalter Erquinigo        # Let's clear using remove and add the mapping in with append
112ca47ac3dSWalter Erquinigo        self.runCmd('settings remove target.source-map 1')
11330350c25SWalter Erquinigo        self.expect(
11430350c25SWalter Erquinigo            'settings show target.source-map',
115ca47ac3dSWalter Erquinigo            substrs=[
116ca47ac3dSWalter Erquinigo                '[0] "." -> "%s"' % (valid_path2),
117ca47ac3dSWalter Erquinigo            ]
11830350c25SWalter Erquinigo        )
119ca47ac3dSWalter Erquinigo        self.runCmd('settings clear target.source-map')
12030350c25SWalter Erquinigo        self.expect(
121ca47ac3dSWalter Erquinigo            'settings append target.source-map . "%s" . "%s" . "%s"' % (invalid_path, src_dir, invalid_path2),
122ca47ac3dSWalter Erquinigo            substrs=[
123ca47ac3dSWalter Erquinigo                'error: the replacement path doesn\'t exist: "%s"' % (invalid_path),
124ca47ac3dSWalter Erquinigo                'the replacement path doesn\'t exist: "%s"' % (invalid_path2),
125ca47ac3dSWalter Erquinigo            ],
12630350c25SWalter Erquinigo            error=True,
12730350c25SWalter Erquinigo        )
128ca47ac3dSWalter Erquinigo        self.expect(
129ca47ac3dSWalter Erquinigo            'settings show target.source-map',
130ca47ac3dSWalter Erquinigo            substrs=[
131ca47ac3dSWalter Erquinigo                '[0] "." -> "%s"' % (src_dir),
132ca47ac3dSWalter Erquinigo            ]
133ca47ac3dSWalter Erquinigo        )
13430350c25SWalter Erquinigo        assertBreakpointWithSourceMap(src_path)
135