199451b44SJordan Rupprechtimport lldb 299451b44SJordan Rupprechtfrom lldbsuite.test.lldbtest import * 399451b44SJordan Rupprechtfrom lldbsuite.test.decorators import * 4d5f54751SJeffrey Tanimport json 530350c25SWalter Erquinigoimport os 699451b44SJordan Rupprecht 799451b44SJordan Rupprecht 899451b44SJordan Rupprechtclass TestTargetSourceMap(TestBase): 999451b44SJordan Rupprecht @no_debug_info_test 10d5f54751SJeffrey Tan def test_source_map_via_setting_api(self): 11d5f54751SJeffrey Tan """ 12d5f54751SJeffrey Tan Test that ensures SBDebugger::GetSetting("target.source-map") API 13d5f54751SJeffrey Tan can correctly fetch source mapping entries. 14d5f54751SJeffrey Tan """ 15d5f54751SJeffrey Tan # Set the target soure map to map "./" to the current test directory 16d5f54751SJeffrey Tan src_dir = self.getSourceDir() 17d5f54751SJeffrey Tan 18d5f54751SJeffrey Tan source_map_setting_path = "target.source-map" 19d5f54751SJeffrey Tan initial_source_map = self.dbg.GetSetting(source_map_setting_path) 20*80fcecb1SJonas Devlieghere self.assertEqual( 212238dcc3SJonas Devlieghere initial_source_map.GetSize(), 0, "Initial source map should be empty" 222238dcc3SJonas Devlieghere ) 23d5f54751SJeffrey Tan 24d5f54751SJeffrey Tan src_dir = self.getSourceDir() 25d5f54751SJeffrey Tan self.runCmd('settings set %s . "%s"' % (source_map_setting_path, src_dir)) 26d5f54751SJeffrey Tan 27d5f54751SJeffrey Tan source_map = self.dbg.GetSetting(source_map_setting_path) 28*80fcecb1SJonas Devlieghere self.assertEqual( 292238dcc3SJonas Devlieghere source_map.GetSize(), 1, "source map should be have one appended entry" 302238dcc3SJonas Devlieghere ) 31d5f54751SJeffrey Tan 32d5f54751SJeffrey Tan stream = lldb.SBStream() 33d5f54751SJeffrey Tan source_map.GetAsJSON(stream) 34d5f54751SJeffrey Tan serialized_source_map = json.loads(stream.GetData()) 35d5f54751SJeffrey Tan 36*80fcecb1SJonas Devlieghere self.assertEqual( 372238dcc3SJonas Devlieghere len(serialized_source_map[0]), 2, "source map entry should have two parts" 382238dcc3SJonas Devlieghere ) 39*80fcecb1SJonas Devlieghere self.assertEqual( 402238dcc3SJonas Devlieghere serialized_source_map[0][0], 412238dcc3SJonas Devlieghere ".", 422238dcc3SJonas Devlieghere "source map entry's first part does not match", 432238dcc3SJonas Devlieghere ) 44*80fcecb1SJonas Devlieghere self.assertEqual( 452238dcc3SJonas Devlieghere serialized_source_map[0][1], 462238dcc3SJonas Devlieghere src_dir, 472238dcc3SJonas Devlieghere "source map entry's second part does not match", 482238dcc3SJonas Devlieghere ) 49d5f54751SJeffrey Tan 50d5f54751SJeffrey Tan @no_debug_info_test 5199451b44SJordan Rupprecht def test_source_map(self): 5299451b44SJordan Rupprecht """Test target.source-map' functionality.""" 5330350c25SWalter Erquinigo 5430350c25SWalter Erquinigo def assertBreakpointWithSourceMap(src_path): 5530350c25SWalter Erquinigo # Set a breakpoint after we remap source and verify that it succeeds 5630350c25SWalter Erquinigo bp = target.BreakpointCreateByLocation(src_path, 2) 57*80fcecb1SJonas Devlieghere self.assertEqual( 582238dcc3SJonas Devlieghere bp.GetNumLocations(), 1, "make sure breakpoint was resolved with map" 592238dcc3SJonas Devlieghere ) 6030350c25SWalter Erquinigo 6130350c25SWalter Erquinigo # Now make sure that we can actually FIND the source file using this 6230350c25SWalter Erquinigo # remapping: 6330350c25SWalter Erquinigo retval = lldb.SBCommandReturnObject() 642238dcc3SJonas Devlieghere self.dbg.GetCommandInterpreter().HandleCommand( 652238dcc3SJonas Devlieghere "source list -f main.c -l 2", retval 662238dcc3SJonas Devlieghere ) 6730350c25SWalter Erquinigo self.assertTrue(retval.Succeeded(), "source list didn't succeed.") 682238dcc3SJonas Devlieghere self.assertNotEqual( 692238dcc3SJonas Devlieghere retval.GetOutput(), None, "We got no ouput from source list" 702238dcc3SJonas Devlieghere ) 712238dcc3SJonas Devlieghere self.assertIn( 722238dcc3SJonas Devlieghere "return", retval.GetOutput(), "We didn't find the source file..." 732238dcc3SJonas Devlieghere ) 7430350c25SWalter Erquinigo 7599451b44SJordan Rupprecht # Set the target soure map to map "./" to the current test directory 7699451b44SJordan Rupprecht src_dir = self.getSourceDir() 7799451b44SJordan Rupprecht src_path = os.path.join(src_dir, "main.c") 7899451b44SJordan Rupprecht yaml_path = os.path.join(src_dir, "a.yaml") 7999451b44SJordan Rupprecht yaml_base, ext = os.path.splitext(yaml_path) 8099451b44SJordan Rupprecht obj_path = self.getBuildArtifact("main.o") 8199451b44SJordan Rupprecht self.yaml2obj(yaml_path, obj_path) 8299451b44SJordan Rupprecht 8399451b44SJordan Rupprecht # Create a target with the object file we just created from YAML 8499451b44SJordan Rupprecht target = self.dbg.CreateTarget(obj_path) 8599451b44SJordan Rupprecht 8699451b44SJordan Rupprecht # Set a breakpoint before we remap source and verify that it fails 8799451b44SJordan Rupprecht bp = target.BreakpointCreateByLocation(src_path, 2) 88*80fcecb1SJonas Devlieghere self.assertEqual( 892238dcc3SJonas Devlieghere bp.GetNumLocations(), 902238dcc3SJonas Devlieghere 0, 912238dcc3SJonas Devlieghere "make sure no breakpoints were resolved without map", 922238dcc3SJonas Devlieghere ) 9399451b44SJordan Rupprecht 94ca47ac3dSWalter Erquinigo valid_path = os.path.dirname(src_dir) 95ca47ac3dSWalter Erquinigo valid_path2 = os.path.dirname(valid_path) 9630350c25SWalter Erquinigo invalid_path = src_dir + "invalid_path" 9730350c25SWalter Erquinigo invalid_path2 = src_dir + "invalid_path2" 9899451b44SJordan Rupprecht 9930350c25SWalter Erquinigo # We make sure the error message contains all the invalid paths 10030350c25SWalter Erquinigo self.expect( 1012238dcc3SJonas Devlieghere 'settings set target.source-map . "%s" . "%s" . "%s" . "%s' 102ca47ac3dSWalter Erquinigo % (invalid_path, src_dir, invalid_path2, valid_path), 10330350c25SWalter Erquinigo substrs=[ 104ca47ac3dSWalter Erquinigo 'error: the replacement path doesn\'t exist: "%s"' % (invalid_path), 10530350c25SWalter Erquinigo 'the replacement path doesn\'t exist: "%s"' % (invalid_path2), 10630350c25SWalter Erquinigo ], 10730350c25SWalter Erquinigo error=True, 10830350c25SWalter Erquinigo ) 10930350c25SWalter Erquinigo self.expect( 1102238dcc3SJonas Devlieghere "settings show target.source-map", 111ca47ac3dSWalter Erquinigo substrs=[ 112ca47ac3dSWalter Erquinigo '[0] "." -> "%s"' % (src_dir), 113ca47ac3dSWalter Erquinigo '[1] "." -> "%s"' % (valid_path), 114ca47ac3dSWalter Erquinigo ], 11530350c25SWalter Erquinigo ) 11630350c25SWalter Erquinigo assertBreakpointWithSourceMap(src_path) 11799451b44SJordan Rupprecht 118ca47ac3dSWalter Erquinigo # Attempts to replace an index to an invalid mapping should have no effect. 119ca47ac3dSWalter Erquinigo # Modifications to valid mappings should work. 12030350c25SWalter Erquinigo self.expect( 1212238dcc3SJonas Devlieghere 'settings replace target.source-map 0 . "%s" . "%s"' 1222238dcc3SJonas Devlieghere % (invalid_path, valid_path2), 123ca47ac3dSWalter Erquinigo substrs=[ 124ca47ac3dSWalter Erquinigo 'error: the replacement path doesn\'t exist: "%s"' % (invalid_path), 125ca47ac3dSWalter Erquinigo ], 12630350c25SWalter Erquinigo error=True, 12730350c25SWalter Erquinigo ) 12830350c25SWalter Erquinigo self.expect( 1292238dcc3SJonas Devlieghere "settings show target.source-map", 130ca47ac3dSWalter Erquinigo substrs=[ 131ca47ac3dSWalter Erquinigo '[0] "." -> "%s"' % (src_dir), 132ca47ac3dSWalter Erquinigo '[1] "." -> "%s"' % (valid_path2), 1332238dcc3SJonas Devlieghere ], 13430350c25SWalter Erquinigo ) 13530350c25SWalter Erquinigo assertBreakpointWithSourceMap(src_path) 13630350c25SWalter Erquinigo 137ca47ac3dSWalter Erquinigo # Let's clear and add the mapping back with insert-after 1382238dcc3SJonas Devlieghere self.runCmd("settings remove target.source-map 0") 13930350c25SWalter Erquinigo self.expect( 1402238dcc3SJonas Devlieghere "settings show target.source-map", 141ca47ac3dSWalter Erquinigo substrs=['[0] "." -> "%s"' % (valid_path2)], 14230350c25SWalter Erquinigo ) 14330350c25SWalter Erquinigo 14430350c25SWalter Erquinigo self.expect( 1452238dcc3SJonas Devlieghere 'settings insert-after target.source-map 0 . "%s" . "%s" . "%s"' 146ca47ac3dSWalter Erquinigo % (invalid_path, invalid_path2, src_dir), 147ca47ac3dSWalter Erquinigo substrs=[ 148ca47ac3dSWalter Erquinigo 'error: the replacement path doesn\'t exist: "%s"' % (invalid_path), 149ca47ac3dSWalter Erquinigo 'the replacement path doesn\'t exist: "%s"' % (invalid_path2), 150ca47ac3dSWalter Erquinigo ], 15130350c25SWalter Erquinigo error=True, 15230350c25SWalter Erquinigo ) 15330350c25SWalter Erquinigo self.expect( 1542238dcc3SJonas Devlieghere "settings show target.source-map", 155ca47ac3dSWalter Erquinigo substrs=[ 156ca47ac3dSWalter Erquinigo '[0] "." -> "%s"' % (valid_path2), 157ca47ac3dSWalter Erquinigo '[1] "." -> "%s"' % (src_dir), 1582238dcc3SJonas Devlieghere ], 15930350c25SWalter Erquinigo ) 16030350c25SWalter Erquinigo 161ca47ac3dSWalter Erquinigo # Let's clear using remove and add the mapping in with append 1622238dcc3SJonas Devlieghere self.runCmd("settings remove target.source-map 1") 16330350c25SWalter Erquinigo self.expect( 1642238dcc3SJonas Devlieghere "settings show target.source-map", 165ca47ac3dSWalter Erquinigo substrs=[ 166ca47ac3dSWalter Erquinigo '[0] "." -> "%s"' % (valid_path2), 1672238dcc3SJonas Devlieghere ], 16830350c25SWalter Erquinigo ) 1692238dcc3SJonas Devlieghere self.runCmd("settings clear target.source-map") 17030350c25SWalter Erquinigo self.expect( 1712238dcc3SJonas Devlieghere 'settings append target.source-map . "%s" . "%s" . "%s"' 1722238dcc3SJonas Devlieghere % (invalid_path, src_dir, invalid_path2), 173ca47ac3dSWalter Erquinigo substrs=[ 174ca47ac3dSWalter Erquinigo 'error: the replacement path doesn\'t exist: "%s"' % (invalid_path), 175ca47ac3dSWalter Erquinigo 'the replacement path doesn\'t exist: "%s"' % (invalid_path2), 176ca47ac3dSWalter Erquinigo ], 17730350c25SWalter Erquinigo error=True, 17830350c25SWalter Erquinigo ) 179ca47ac3dSWalter Erquinigo self.expect( 1802238dcc3SJonas Devlieghere "settings show target.source-map", 181ca47ac3dSWalter Erquinigo substrs=[ 182ca47ac3dSWalter Erquinigo '[0] "." -> "%s"' % (src_dir), 1832238dcc3SJonas Devlieghere ], 184ca47ac3dSWalter Erquinigo ) 18530350c25SWalter Erquinigo assertBreakpointWithSourceMap(src_path) 186