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