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