| """ |
| Test scopes in C++. |
| """ |
| import lldb |
| from lldbsuite.test.decorators import * |
| from lldbsuite.test.lldbtest import * |
| from lldbsuite.test import lldbutil |
| |
| |
| class TestCppScopes(TestBase): |
| |
| mydir = TestBase.compute_mydir(__file__) |
| |
| @expectedFailureAll(oslist=["windows"], bugnumber="llvm.org/pr24764") |
| def test_all_but_c(self): |
| self.do_test(False) |
| |
| @expectedFailureAll(oslist=["windows"]) |
| def test_c(self): |
| self.do_test(True) |
| |
| def do_test(self, test_c): |
| self.build() |
| |
| # Get main source file |
| src_file = os.path.join(self.getSourceDir(), "main.cpp") |
| src_file_spec = lldb.SBFileSpec(src_file) |
| self.assertTrue(src_file_spec.IsValid(), "Main source file") |
| |
| # Get the path of the executable |
| exe_path = self.getBuildArtifact("a.out") |
| |
| # Load the executable |
| target = self.dbg.CreateTarget(exe_path) |
| self.assertTrue(target.IsValid(), VALID_TARGET) |
| |
| # Break on main function |
| main_breakpoint = target.BreakpointCreateBySourceRegex( |
| "// break here", src_file_spec) |
| self.assertTrue( |
| main_breakpoint.IsValid() and main_breakpoint.GetNumLocations() >= 1, |
| VALID_BREAKPOINT) |
| |
| # Launch the process |
| args = None |
| env = None |
| process = target.LaunchSimple( |
| args, env, self.get_process_working_directory()) |
| self.assertTrue(process.IsValid(), PROCESS_IS_VALID) |
| |
| # Get the thread of the process |
| self.assertTrue( |
| process.GetState() == lldb.eStateStopped, |
| PROCESS_STOPPED) |
| thread = lldbutil.get_stopped_thread( |
| process, lldb.eStopReasonBreakpoint) |
| |
| # Get current fream of the thread at the breakpoint |
| frame = thread.GetSelectedFrame() |
| |
| # Test result for scopes of variables |
| |
| global_variables = frame.GetVariables(True, True, True, False) |
| global_variables_assert = { |
| 'A::a': 1111, |
| 'B::a': 2222, |
| 'C::a': 3333, |
| '::a': 4444, |
| 'a': 4444 |
| } |
| |
| self.assertTrue( |
| global_variables.GetSize() == 4, |
| "target variable returns all variables") |
| for variable in global_variables: |
| name = variable.GetName() |
| self.assertTrue( |
| name in global_variables_assert, |
| "target variable returns wrong variable " + name) |
| |
| for name in global_variables_assert: |
| if name is "C::a" and not test_c: |
| continue |
| if name is not "C::a" and test_c: |
| continue |
| |
| value = frame.EvaluateExpression(name) |
| assert_value = global_variables_assert[name] |
| self.assertTrue( |
| value.IsValid() and value.GetValueAsSigned() == assert_value, |
| name + " = " + str(assert_value)) |