| """ |
| Test lldb data formatter subsystem. |
| """ |
| |
| from __future__ import print_function |
| |
| |
| import os |
| import time |
| import lldb |
| from lldbsuite.test.decorators import * |
| from lldbsuite.test.lldbtest import * |
| from lldbsuite.test import lldbutil |
| |
| |
| class DataFormatterSynthValueTestCase(TestBase): |
| |
| mydir = TestBase.compute_mydir(__file__) |
| |
| def setUp(self): |
| # Call super's setUp(). |
| TestBase.setUp(self) |
| # Find the line number to break at. |
| self.line = line_number('main.cpp', 'break here') |
| |
| @skipIfFreeBSD # llvm.org/pr20545 bogus output confuses buildbot parser |
| @expectedFailureAll( |
| oslist=["windows"], |
| bugnumber="llvm.org/pr24462, Data formatters have problems on Windows") |
| def test_with_run_command(self): |
| """Test using Python synthetic children provider to provide a value.""" |
| self.build() |
| self.runCmd("file " + self.getBuildArtifact("a.out"), CURRENT_EXECUTABLE_SET) |
| |
| lldbutil.run_break_set_by_file_and_line( |
| self, "main.cpp", self.line, num_expected_locations=1, loc_exact=True) |
| |
| self.runCmd("run", RUN_SUCCEEDED) |
| |
| # The stop reason of the thread should be breakpoint. |
| self.expect("thread list", STOPPED_DUE_TO_BREAKPOINT, |
| substrs=['stopped', |
| 'stop reason = breakpoint']) |
| |
| # This is the function to remove the custom formats in order to have a |
| # clean slate for the next test case. |
| def cleanup(): |
| self.runCmd('type format clear', check=False) |
| self.runCmd('type summary clear', check=False) |
| self.runCmd('type filter clear', check=False) |
| self.runCmd('type synth clear', check=False) |
| |
| # Execute the cleanup function during test case tear down. |
| self.addTearDownHook(cleanup) |
| |
| x = self.frame().FindVariable("x") |
| x.SetPreferSyntheticValue(True) |
| y = self.frame().FindVariable("y") |
| y.SetPreferSyntheticValue(True) |
| z = self.frame().FindVariable("z") |
| z.SetPreferSyntheticValue(True) |
| q = self.frame().FindVariable("q") |
| z.SetPreferSyntheticValue(True) |
| |
| x_val = x.GetValueAsUnsigned |
| y_val = y.GetValueAsUnsigned |
| z_val = z.GetValueAsUnsigned |
| q_val = q.GetValueAsUnsigned |
| |
| if self.TraceOn(): |
| print( |
| "x_val = %s; y_val = %s; z_val = %s; q_val = %s" % |
| (x_val(), y_val(), z_val(), q_val())) |
| |
| self.assertFalse(x_val() == 3, "x == 3 before synthetics") |
| self.assertFalse(y_val() == 4, "y == 4 before synthetics") |
| self.assertFalse(z_val() == 7, "z == 7 before synthetics") |
| self.assertFalse(q_val() == 8, "q == 8 before synthetics") |
| |
| # now set up the synth |
| self.runCmd("script from myIntSynthProvider import *") |
| self.runCmd("type synth add -l myIntSynthProvider myInt") |
| self.runCmd("type synth add -l myArraySynthProvider myArray") |
| self.runCmd("type synth add -l myIntSynthProvider myIntAndStuff") |
| |
| if self.TraceOn(): |
| print( |
| "x_val = %s; y_val = %s; z_val = %s; q_val = %s" % |
| (x_val(), y_val(), z_val(), q_val())) |
| |
| self.assertTrue(x_val() == 3, "x != 3 after synthetics") |
| self.assertTrue(y_val() == 4, "y != 4 after synthetics") |
| self.assertTrue(z_val() == 7, "z != 7 after synthetics") |
| self.assertTrue(q_val() == 8, "q != 8 after synthetics") |
| |
| self.expect("frame variable x", substrs=['3']) |
| self.expect( |
| "frame variable x", |
| substrs=['theValue = 3'], |
| matching=False) |
| self.expect("frame variable q", substrs=['8']) |
| self.expect( |
| "frame variable q", |
| substrs=['theValue = 8'], |
| matching=False) |
| |
| # check that an aptly defined synthetic provider does not affect |
| # one-lining |
| self.expect( |
| "expression struct S { myInt theInt{12}; }; S()", |
| substrs=['(theInt = 12)']) |
| |
| # check that we can use a synthetic value in a summary |
| self.runCmd("type summary add hasAnInt -s ${var.theInt}") |
| hi = self.frame().FindVariable("hi") |
| self.assertEqual(hi.GetSummary(), "42") |
| |
| ma = self.frame().FindVariable("ma") |
| self.assertTrue(ma.IsValid()) |
| self.assertEqual(ma.GetNumChildren(15), 15) |
| self.assertEqual(ma.GetNumChildren(16), 16) |
| self.assertEqual(ma.GetNumChildren(17), 16) |