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