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")
2730350c25SWalter Erquinigo            self.assertTrue("return" in 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
45*ca47ac3dSWalter Erquinigo        valid_path = os.path.dirname(src_dir)
46*ca47ac3dSWalter 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(
52*ca47ac3dSWalter Erquinigo            'settings set target.source-map . "%s" . "%s" . "%s" . "%s' \
53*ca47ac3dSWalter Erquinigo                % (invalid_path, src_dir, invalid_path2, valid_path),
5430350c25SWalter Erquinigo            substrs=[
55*ca47ac3dSWalter 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',
62*ca47ac3dSWalter Erquinigo            substrs=[
63*ca47ac3dSWalter Erquinigo                '[0] "." -> "%s"' % (src_dir),
64*ca47ac3dSWalter Erquinigo                '[1] "." -> "%s"' % (valid_path),
65*ca47ac3dSWalter Erquinigo            ],
6630350c25SWalter Erquinigo        )
6730350c25SWalter Erquinigo        assertBreakpointWithSourceMap(src_path)
6899451b44SJordan Rupprecht
69*ca47ac3dSWalter Erquinigo        # Attempts to replace an index to an invalid mapping should have no effect.
70*ca47ac3dSWalter Erquinigo        # Modifications to valid mappings should work.
7130350c25SWalter Erquinigo        self.expect(
72*ca47ac3dSWalter Erquinigo            'settings replace target.source-map 0 . "%s" . "%s"' % (invalid_path, valid_path2),
73*ca47ac3dSWalter Erquinigo            substrs=[
74*ca47ac3dSWalter Erquinigo                'error: the replacement path doesn\'t exist: "%s"' % (invalid_path),
75*ca47ac3dSWalter Erquinigo            ],
7630350c25SWalter Erquinigo            error=True,
7730350c25SWalter Erquinigo        )
7830350c25SWalter Erquinigo        self.expect(
7930350c25SWalter Erquinigo            'settings show target.source-map',
80*ca47ac3dSWalter Erquinigo            substrs=[
81*ca47ac3dSWalter Erquinigo                '[0] "." -> "%s"' % (src_dir),
82*ca47ac3dSWalter Erquinigo                '[1] "." -> "%s"' % (valid_path2),
83*ca47ac3dSWalter Erquinigo            ]
8430350c25SWalter Erquinigo        )
8530350c25SWalter Erquinigo        assertBreakpointWithSourceMap(src_path)
8630350c25SWalter Erquinigo
87*ca47ac3dSWalter 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',
91*ca47ac3dSWalter Erquinigo            substrs=['[0] "." -> "%s"' % (valid_path2)],
9230350c25SWalter Erquinigo        )
9330350c25SWalter Erquinigo
9430350c25SWalter Erquinigo        self.expect(
95*ca47ac3dSWalter Erquinigo            'settings insert-after target.source-map 0 . "%s" . "%s" . "%s"' \
96*ca47ac3dSWalter Erquinigo                % (invalid_path, invalid_path2, src_dir),
97*ca47ac3dSWalter Erquinigo            substrs=[
98*ca47ac3dSWalter Erquinigo                'error: the replacement path doesn\'t exist: "%s"' % (invalid_path),
99*ca47ac3dSWalter Erquinigo                'the replacement path doesn\'t exist: "%s"' % (invalid_path2),
100*ca47ac3dSWalter Erquinigo            ],
10130350c25SWalter Erquinigo            error=True,
10230350c25SWalter Erquinigo        )
10330350c25SWalter Erquinigo        self.expect(
10430350c25SWalter Erquinigo            'settings show target.source-map',
105*ca47ac3dSWalter Erquinigo            substrs=[
106*ca47ac3dSWalter Erquinigo                '[0] "." -> "%s"' % (valid_path2),
107*ca47ac3dSWalter Erquinigo                '[1] "." -> "%s"' % (src_dir),
108*ca47ac3dSWalter Erquinigo            ]
10930350c25SWalter Erquinigo        )
11030350c25SWalter Erquinigo
111*ca47ac3dSWalter Erquinigo        # Let's clear using remove and add the mapping in with append
112*ca47ac3dSWalter Erquinigo        self.runCmd('settings remove target.source-map 1')
11330350c25SWalter Erquinigo        self.expect(
11430350c25SWalter Erquinigo            'settings show target.source-map',
115*ca47ac3dSWalter Erquinigo            substrs=[
116*ca47ac3dSWalter Erquinigo                '[0] "." -> "%s"' % (valid_path2),
117*ca47ac3dSWalter Erquinigo            ]
11830350c25SWalter Erquinigo        )
119*ca47ac3dSWalter Erquinigo        self.runCmd('settings clear target.source-map')
12030350c25SWalter Erquinigo        self.expect(
121*ca47ac3dSWalter Erquinigo            'settings append target.source-map . "%s" . "%s" . "%s"' % (invalid_path, src_dir, invalid_path2),
122*ca47ac3dSWalter Erquinigo            substrs=[
123*ca47ac3dSWalter Erquinigo                'error: the replacement path doesn\'t exist: "%s"' % (invalid_path),
124*ca47ac3dSWalter Erquinigo                'the replacement path doesn\'t exist: "%s"' % (invalid_path2),
125*ca47ac3dSWalter Erquinigo            ],
12630350c25SWalter Erquinigo            error=True,
12730350c25SWalter Erquinigo        )
128*ca47ac3dSWalter Erquinigo        self.expect(
129*ca47ac3dSWalter Erquinigo            'settings show target.source-map',
130*ca47ac3dSWalter Erquinigo            substrs=[
131*ca47ac3dSWalter Erquinigo                '[0] "." -> "%s"' % (src_dir),
132*ca47ac3dSWalter Erquinigo            ]
133*ca47ac3dSWalter Erquinigo        )
13430350c25SWalter Erquinigo        assertBreakpointWithSourceMap(src_path)
135