177c9aafcSWalter Erquinigo""" 277c9aafcSWalter ErquinigoTest lldb-vscode setBreakpoints request 377c9aafcSWalter Erquinigo""" 477c9aafcSWalter Erquinigo 577c9aafcSWalter Erquinigofrom __future__ import print_function 677c9aafcSWalter Erquinigo 777c9aafcSWalter Erquinigoimport unittest2 877c9aafcSWalter Erquinigoimport vscode 977c9aafcSWalter Erquinigofrom lldbsuite.test.decorators import * 1077c9aafcSWalter Erquinigofrom lldbsuite.test.lldbtest import * 1177c9aafcSWalter Erquinigofrom lldbsuite.test import lldbutil 1277c9aafcSWalter Erquinigoimport lldbvscode_testcase 132c1bea88SYifan Shenimport re 1477c9aafcSWalter Erquinigo 1577c9aafcSWalter Erquinigoclass TestVSCode_module(lldbvscode_testcase.VSCodeTestCaseBase): 1677c9aafcSWalter Erquinigo 172c1bea88SYifan Shen def run_test(self, symbol_basename, expect_debug_info_size): 1877c9aafcSWalter Erquinigo program_basename = "a.out.stripped" 1977c9aafcSWalter Erquinigo program = self.getBuildArtifact(program_basename) 2077c9aafcSWalter Erquinigo self.build_and_launch(program) 2177c9aafcSWalter Erquinigo functions = ['foo'] 2277c9aafcSWalter Erquinigo breakpoint_ids = self.set_function_breakpoints(functions) 232c1bea88SYifan Shen self.assertEquals(len(breakpoint_ids), len(functions), 'expect one breakpoint') 2477c9aafcSWalter Erquinigo self.continue_to_breakpoints(breakpoint_ids) 2539239f9bSWalter Erquinigo active_modules = self.vscode.get_modules() 26313b6074SWalter Erquinigo program_module = active_modules[program_basename] 272c1bea88SYifan Shen self.assertIn(program_basename, active_modules, '%s module is in active modules' % (program_basename)) 2877c9aafcSWalter Erquinigo self.assertIn('name', program_module, 'make sure name is in module') 2977c9aafcSWalter Erquinigo self.assertEqual(program_basename, program_module['name']) 3077c9aafcSWalter Erquinigo self.assertIn('path', program_module, 'make sure path is in module') 3177c9aafcSWalter Erquinigo self.assertEqual(program, program_module['path']) 323cc37622SDave Lee self.assertNotIn('symbolFilePath', program_module, 'Make sure a.out.stripped has no debug info') 332c1bea88SYifan Shen symbols_path = self.getBuildArtifact(symbol_basename) 342c1bea88SYifan Shen self.vscode.request_evaluate('`%s' % ('target symbols add -s "%s" "%s"' % (program, symbols_path))) 35869d05fbSWalter Erquinigo 362c1bea88SYifan Shen def checkSymbolsLoadedWithSize(): 3739239f9bSWalter Erquinigo active_modules = self.vscode.get_modules() 382c1bea88SYifan Shen program_module = active_modules[program_basename] 39ddcc7ce5SWalter Erquinigo self.assertIn('symbolFilePath', program_module) 40ddcc7ce5SWalter Erquinigo self.assertIn(symbols_path, program_module['symbolFilePath']) 4182139b87SYifan Shen symbol_regex = re.compile(r"[0-9]+(\.[0-9]*)?[KMG]?B") 422c1bea88SYifan Shen return symbol_regex.match(program_module['symbolStatus']) 432c1bea88SYifan Shen 442c1bea88SYifan Shen if expect_debug_info_size: 452c1bea88SYifan Shen self.waitUntil(checkSymbolsLoadedWithSize) 4639239f9bSWalter Erquinigo active_modules = self.vscode.get_modules() 4777c9aafcSWalter Erquinigo program_module = active_modules[program_basename] 4877c9aafcSWalter Erquinigo self.assertEqual(program_basename, program_module['name']) 4977c9aafcSWalter Erquinigo self.assertEqual(program, program_module['path']) 5077c9aafcSWalter Erquinigo self.assertIn('addressRange', program_module) 5177c9aafcSWalter Erquinigo 5277c9aafcSWalter Erquinigo @skipIfWindows 5377c9aafcSWalter Erquinigo @skipIfRemote 5439239f9bSWalter Erquinigo def test_modules(self): 552c1bea88SYifan Shen ''' 562c1bea88SYifan Shen Mac or linux. 572c1bea88SYifan Shen 582c1bea88SYifan Shen On mac, if we load a.out as our symbol file, we will use DWARF with .o files and we will 592c1bea88SYifan Shen have debug symbols, but we won't see any debug info size because all of the DWARF 602c1bea88SYifan Shen sections are in .o files. 612c1bea88SYifan Shen 622c1bea88SYifan Shen On other platforms, we expect a.out to have debug info, so we will expect a size. 632c1bea88SYifan Shen ''' 6439239f9bSWalter Erquinigo return self.run_test("a.out", expect_debug_info_size=platform.system() != 'Darwin') 652c1bea88SYifan Shen 662c1bea88SYifan Shen @skipUnlessDarwin 672c1bea88SYifan Shen @skipIfRemote 6839239f9bSWalter Erquinigo def test_modules_dsym(self): 692c1bea88SYifan Shen ''' 702c1bea88SYifan Shen Darwin only test with dSYM file. 712c1bea88SYifan Shen 722c1bea88SYifan Shen On mac, if we load a.out.dSYM as our symbol file, we will have debug symbols and we 732c1bea88SYifan Shen will have DWARF sections added to the module, so we will expect a size. 742c1bea88SYifan Shen ''' 7539239f9bSWalter Erquinigo return self.run_test("a.out.dSYM", expect_debug_info_size=True) 762c1bea88SYifan Shen 772c1bea88SYifan Shen @skipIfWindows 782c1bea88SYifan Shen @skipIfRemote 79*f47a84bcSMichał Górny @expectedFailureAll(oslist=["freebsd"], bugnumber="llvm.org/pr49418") 8077c9aafcSWalter Erquinigo def test_compile_units(self): 8177c9aafcSWalter Erquinigo program = self.getBuildArtifact("a.out") 8277c9aafcSWalter Erquinigo self.build_and_launch(program) 8377c9aafcSWalter Erquinigo source = "main.cpp" 8477c9aafcSWalter Erquinigo main_source_path = self.getSourcePath(source) 8577c9aafcSWalter Erquinigo breakpoint1_line = line_number(source, '// breakpoint 1') 8677c9aafcSWalter Erquinigo lines = [breakpoint1_line] 8777c9aafcSWalter Erquinigo breakpoint_ids = self.set_source_breakpoints(source, lines) 8877c9aafcSWalter Erquinigo self.continue_to_breakpoints(breakpoint_ids) 8939239f9bSWalter Erquinigo moduleId = self.vscode.get_modules()['a.out']['id'] 9039239f9bSWalter Erquinigo response = self.vscode.request_compileUnits(moduleId) 9177c9aafcSWalter Erquinigo self.assertTrue(response['body']) 92619e2e09SDave Lee self.assertEqual(len(response['body']['compileUnits']), 1, 9377c9aafcSWalter Erquinigo 'Only one source file should exist') 94619e2e09SDave Lee self.assertEqual(response['body']['compileUnits'][0]['compileUnitPath'], main_source_path, 9577c9aafcSWalter Erquinigo 'Real path to main.cpp matches') 96