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