1"""
2Test lldb-vscode setBreakpoints request
3"""
4
5from __future__ import print_function
6
7import unittest2
8import vscode
9from lldbsuite.test.decorators import *
10from lldbsuite.test.lldbtest import *
11from lldbsuite.test import lldbutil
12import lldbvscode_testcase
13
14class TestVSCode_module(lldbvscode_testcase.VSCodeTestCaseBase):
15
16    mydir = TestBase.compute_mydir(__file__)
17
18
19    @skipIfWindows
20    @skipUnlessDarwin
21    @skipIfRemote
22    def test_modules_event(self):
23        program_basename = "a.out.stripped"
24        program= self.getBuildArtifact(program_basename)
25        self.build_and_launch(program)
26        functions = ['foo']
27        breakpoint_ids = self.set_function_breakpoints(functions)
28        self.assertEquals(len(breakpoint_ids), len(functions),
29                        'expect one breakpoint')
30        self.continue_to_breakpoints(breakpoint_ids)
31        active_modules = self.vscode.get_active_modules()
32        self.assertIn(program_basename, active_modules, '%s module is in active modules' % (program_basename))
33        program_module = active_modules[program_basename]
34        self.assertIn('name', program_module, 'make sure name is in module')
35        self.assertEqual(program_basename, program_module['name'])
36        self.assertIn('path', program_module, 'make sure path is in module')
37        self.assertEqual(program, program_module['path'])
38        self.assertTrue('symbolFilePath' not in program_module, 'Make sure a.out.stripped has no debug info')
39        self.assertEqual('Symbols not found.', program_module['symbolStatus'])
40        symbol_path = self.getBuildArtifact("a.out")
41        self.vscode.request_evaluate('`%s' % ('target symbols add -s "%s" "%s"' % (program, symbol_path)))
42
43        def checkSymbolsLoaded():
44            active_modules = self.vscode.get_active_modules()
45            program_module = active_modules[program_basename]
46            return 'Symbols loaded.' == program_module['symbolStatus']
47        self.waitUntil(checkSymbolsLoaded)
48
49        active_modules = self.vscode.get_active_modules()
50        program_module = active_modules[program_basename]
51        self.assertEqual(program_basename, program_module['name'])
52        self.assertEqual(program, program_module['path'])
53        self.assertEqual('Symbols loaded.', program_module['symbolStatus'])
54        self.assertIn('symbolFilePath', program_module)
55        self.assertEqual(symbol_path, program_module['symbolFilePath'])
56        self.assertIn('addressRange', program_module)
57
58    @skipIfWindows
59    @skipUnlessDarwin
60    @skipIfRemote
61    def test_compile_units(self):
62        program= self.getBuildArtifact("a.out")
63        self.build_and_launch(program)
64        source = "main.cpp"
65        main_source_path = self.getSourcePath(source)
66        breakpoint1_line = line_number(source, '// breakpoint 1')
67        lines = [breakpoint1_line]
68        breakpoint_ids = self.set_source_breakpoints(source, lines)
69        self.continue_to_breakpoints(breakpoint_ids)
70        moduleId = self.vscode.get_active_modules()['a.out']['id']
71        response = self.vscode.request_getCompileUnits(moduleId)
72        self.assertTrue(response['body'])
73        self.assertTrue(len(response['body']['compileUnits']) == 1,
74                        'Only one source file should exist')
75        self.assertTrue(response['body']['compileUnits'][0]['compileUnitPath'] == main_source_path,
76                        'Real path to main.cpp matches')
77
78