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    @no_debug_info_test
1099451b44SJordan Rupprecht    def test_source_map(self):
1199451b44SJordan Rupprecht        """Test target.source-map' functionality."""
1230350c25SWalter Erquinigo
1330350c25SWalter Erquinigo        def assertBreakpointWithSourceMap(src_path):
1430350c25SWalter Erquinigo            # Set a breakpoint after we remap source and verify that it succeeds
1530350c25SWalter Erquinigo            bp = target.BreakpointCreateByLocation(src_path, 2)
1630350c25SWalter Erquinigo            self.assertEquals(bp.GetNumLocations(), 1,
1730350c25SWalter Erquinigo                            "make sure breakpoint was resolved with map")
1830350c25SWalter Erquinigo
1930350c25SWalter Erquinigo            # Now make sure that we can actually FIND the source file using this
2030350c25SWalter Erquinigo            # remapping:
2130350c25SWalter Erquinigo            retval = lldb.SBCommandReturnObject()
2230350c25SWalter Erquinigo            self.dbg.GetCommandInterpreter().HandleCommand("source list -f main.c -l 2", retval)
2330350c25SWalter Erquinigo            self.assertTrue(retval.Succeeded(), "source list didn't succeed.")
2430350c25SWalter Erquinigo            self.assertNotEqual(retval.GetOutput(), None, "We got no ouput from source list")
25*3cc37622SDave Lee            self.assertIn("return", retval.GetOutput(), "We didn't find the source file...")
2630350c25SWalter Erquinigo
2799451b44SJordan Rupprecht        # Set the target soure map to map "./" to the current test directory
2899451b44SJordan Rupprecht        src_dir = self.getSourceDir()
2999451b44SJordan Rupprecht        src_path = os.path.join(src_dir, "main.c")
3099451b44SJordan Rupprecht        yaml_path = os.path.join(src_dir, "a.yaml")
3199451b44SJordan Rupprecht        yaml_base, ext = os.path.splitext(yaml_path)
3299451b44SJordan Rupprecht        obj_path = self.getBuildArtifact("main.o")
3399451b44SJordan Rupprecht        self.yaml2obj(yaml_path, obj_path)
3499451b44SJordan Rupprecht
3599451b44SJordan Rupprecht        # Create a target with the object file we just created from YAML
3699451b44SJordan Rupprecht        target = self.dbg.CreateTarget(obj_path)
3799451b44SJordan Rupprecht
3899451b44SJordan Rupprecht        # Set a breakpoint before we remap source and verify that it fails
3999451b44SJordan Rupprecht        bp = target.BreakpointCreateByLocation(src_path, 2)
40b3a0c4d7SRaphael Isemann        self.assertEquals(bp.GetNumLocations(), 0,
4199451b44SJordan Rupprecht                        "make sure no breakpoints were resolved without map")
4299451b44SJordan Rupprecht
43ca47ac3dSWalter Erquinigo        valid_path = os.path.dirname(src_dir)
44ca47ac3dSWalter Erquinigo        valid_path2 = os.path.dirname(valid_path)
4530350c25SWalter Erquinigo        invalid_path = src_dir + "invalid_path"
4630350c25SWalter Erquinigo        invalid_path2 = src_dir + "invalid_path2"
4799451b44SJordan Rupprecht
4830350c25SWalter Erquinigo        # We make sure the error message contains all the invalid paths
4930350c25SWalter Erquinigo        self.expect(
50ca47ac3dSWalter Erquinigo            'settings set target.source-map . "%s" . "%s" . "%s" . "%s' \
51ca47ac3dSWalter Erquinigo                % (invalid_path, src_dir, invalid_path2, valid_path),
5230350c25SWalter Erquinigo            substrs=[
53ca47ac3dSWalter Erquinigo                'error: the replacement path doesn\'t exist: "%s"' % (invalid_path),
5430350c25SWalter Erquinigo                'the replacement path doesn\'t exist: "%s"' % (invalid_path2),
5530350c25SWalter Erquinigo            ],
5630350c25SWalter Erquinigo            error=True,
5730350c25SWalter Erquinigo        )
5830350c25SWalter Erquinigo        self.expect(
5930350c25SWalter Erquinigo            'settings show target.source-map',
60ca47ac3dSWalter Erquinigo            substrs=[
61ca47ac3dSWalter Erquinigo                '[0] "." -> "%s"' % (src_dir),
62ca47ac3dSWalter Erquinigo                '[1] "." -> "%s"' % (valid_path),
63ca47ac3dSWalter Erquinigo            ],
6430350c25SWalter Erquinigo        )
6530350c25SWalter Erquinigo        assertBreakpointWithSourceMap(src_path)
6699451b44SJordan Rupprecht
67ca47ac3dSWalter Erquinigo        # Attempts to replace an index to an invalid mapping should have no effect.
68ca47ac3dSWalter Erquinigo        # Modifications to valid mappings should work.
6930350c25SWalter Erquinigo        self.expect(
70ca47ac3dSWalter Erquinigo            'settings replace target.source-map 0 . "%s" . "%s"' % (invalid_path, valid_path2),
71ca47ac3dSWalter Erquinigo            substrs=[
72ca47ac3dSWalter Erquinigo                'error: the replacement path doesn\'t exist: "%s"' % (invalid_path),
73ca47ac3dSWalter Erquinigo            ],
7430350c25SWalter Erquinigo            error=True,
7530350c25SWalter Erquinigo        )
7630350c25SWalter Erquinigo        self.expect(
7730350c25SWalter Erquinigo            'settings show target.source-map',
78ca47ac3dSWalter Erquinigo            substrs=[
79ca47ac3dSWalter Erquinigo                '[0] "." -> "%s"' % (src_dir),
80ca47ac3dSWalter Erquinigo                '[1] "." -> "%s"' % (valid_path2),
81ca47ac3dSWalter Erquinigo            ]
8230350c25SWalter Erquinigo        )
8330350c25SWalter Erquinigo        assertBreakpointWithSourceMap(src_path)
8430350c25SWalter Erquinigo
85ca47ac3dSWalter Erquinigo        # Let's clear and add the mapping back with insert-after
8630350c25SWalter Erquinigo        self.runCmd('settings remove target.source-map 0')
8730350c25SWalter Erquinigo        self.expect(
8830350c25SWalter Erquinigo            'settings show target.source-map',
89ca47ac3dSWalter Erquinigo            substrs=['[0] "." -> "%s"' % (valid_path2)],
9030350c25SWalter Erquinigo        )
9130350c25SWalter Erquinigo
9230350c25SWalter Erquinigo        self.expect(
93ca47ac3dSWalter Erquinigo            'settings insert-after target.source-map 0 . "%s" . "%s" . "%s"' \
94ca47ac3dSWalter Erquinigo                % (invalid_path, invalid_path2, src_dir),
95ca47ac3dSWalter Erquinigo            substrs=[
96ca47ac3dSWalter Erquinigo                'error: the replacement path doesn\'t exist: "%s"' % (invalid_path),
97ca47ac3dSWalter Erquinigo                'the replacement path doesn\'t exist: "%s"' % (invalid_path2),
98ca47ac3dSWalter Erquinigo            ],
9930350c25SWalter Erquinigo            error=True,
10030350c25SWalter Erquinigo        )
10130350c25SWalter Erquinigo        self.expect(
10230350c25SWalter Erquinigo            'settings show target.source-map',
103ca47ac3dSWalter Erquinigo            substrs=[
104ca47ac3dSWalter Erquinigo                '[0] "." -> "%s"' % (valid_path2),
105ca47ac3dSWalter Erquinigo                '[1] "." -> "%s"' % (src_dir),
106ca47ac3dSWalter Erquinigo            ]
10730350c25SWalter Erquinigo        )
10830350c25SWalter Erquinigo
109ca47ac3dSWalter Erquinigo        # Let's clear using remove and add the mapping in with append
110ca47ac3dSWalter Erquinigo        self.runCmd('settings remove target.source-map 1')
11130350c25SWalter Erquinigo        self.expect(
11230350c25SWalter Erquinigo            'settings show target.source-map',
113ca47ac3dSWalter Erquinigo            substrs=[
114ca47ac3dSWalter Erquinigo                '[0] "." -> "%s"' % (valid_path2),
115ca47ac3dSWalter Erquinigo            ]
11630350c25SWalter Erquinigo        )
117ca47ac3dSWalter Erquinigo        self.runCmd('settings clear target.source-map')
11830350c25SWalter Erquinigo        self.expect(
119ca47ac3dSWalter Erquinigo            'settings append target.source-map . "%s" . "%s" . "%s"' % (invalid_path, src_dir, invalid_path2),
120ca47ac3dSWalter Erquinigo            substrs=[
121ca47ac3dSWalter Erquinigo                'error: the replacement path doesn\'t exist: "%s"' % (invalid_path),
122ca47ac3dSWalter Erquinigo                'the replacement path doesn\'t exist: "%s"' % (invalid_path2),
123ca47ac3dSWalter Erquinigo            ],
12430350c25SWalter Erquinigo            error=True,
12530350c25SWalter Erquinigo        )
126ca47ac3dSWalter Erquinigo        self.expect(
127ca47ac3dSWalter Erquinigo            'settings show target.source-map',
128ca47ac3dSWalter Erquinigo            substrs=[
129ca47ac3dSWalter Erquinigo                '[0] "." -> "%s"' % (src_dir),
130ca47ac3dSWalter Erquinigo            ]
131ca47ac3dSWalter Erquinigo        )
13230350c25SWalter Erquinigo        assertBreakpointWithSourceMap(src_path)
133