summaryrefslogtreecommitdiffstats
path: root/lldb/test/functionalities/data-formatter/data-formatter-python-synth
diff options
context:
space:
mode:
Diffstat (limited to 'lldb/test/functionalities/data-formatter/data-formatter-python-synth')
-rw-r--r--lldb/test/functionalities/data-formatter/data-formatter-python-synth/TestDataFormatterPythonSynth.py95
-rw-r--r--lldb/test/functionalities/data-formatter/data-formatter-python-synth/fooSynthProvider.py40
-rw-r--r--lldb/test/functionalities/data-formatter/data-formatter-python-synth/ftsp.py16
-rw-r--r--lldb/test/functionalities/data-formatter/data-formatter-python-synth/main.cpp7
4 files changed, 124 insertions, 34 deletions
diff --git a/lldb/test/functionalities/data-formatter/data-formatter-python-synth/TestDataFormatterPythonSynth.py b/lldb/test/functionalities/data-formatter/data-formatter-python-synth/TestDataFormatterPythonSynth.py
index 936e5bdda6f..73a7bac40d1 100644
--- a/lldb/test/functionalities/data-formatter/data-formatter-python-synth/TestDataFormatterPythonSynth.py
+++ b/lldb/test/functionalities/data-formatter/data-formatter-python-synth/TestDataFormatterPythonSynth.py
@@ -22,14 +22,28 @@ class PythonSynthDataFormatterTestCase(TestBase):
self.buildDwarf()
self.data_formatter_commands()
+ @unittest2.skipUnless(sys.platform.startswith("darwin"), "requires Darwin")
+ def test_rdar10960550_with_dsym_and_run_command(self):
+ """Test data formatter commands."""
+ self.buildDsym()
+ self.rdar10960550_formatter_commands()
+
+ def test_rdar10960550_with_dwarf_and_run_command(self):
+ """Test data formatter commands."""
+ self.buildDwarf()
+ self.rdar10960550_formatter_commands()
+
+
def setUp(self):
# Call super's setUp().
TestBase.setUp(self)
# Find the line number to break at.
self.line = line_number('main.cpp', '// Set break point at this line.')
+ self.line2 = line_number('main.cpp', '// Set cast break point at this line.')
+ self.line3 = line_number('main.cpp', '// Set second cast break point at this line.')
def data_formatter_commands(self):
- """Test that that file and class static variables display correctly."""
+ """Test using Python synthetic children provider."""
self.runCmd("file a.out", CURRENT_EXECUTABLE_SET)
self.expect("breakpoint set -f main.cpp -l %d" % self.line,
@@ -184,17 +198,74 @@ class PythonSynthDataFormatterTestCase(TestBase):
self.expect("frame variable f00_1", matching=False,
substrs = ['fake_a = '])
-
- self.runCmd("n")
-
- self.runCmd("script from ftsp import *")
- self.runCmd("type synth add -l ftsp wrapint")
-
- self.expect('frame variable test_cast',
- substrs = ['A',
- 'B',
- 'C',
- 'D'])
+
+ def rdar10960550_formatter_commands(self):
+ """Test that synthetic children persist stoppoints."""
+ self.runCmd("file a.out", CURRENT_EXECUTABLE_SET)
+
+ self.expect("breakpoint set -f main.cpp -l %d" % self.line2,
+ BREAKPOINT_CREATED,
+ startstr = "Breakpoint created: 1: file ='main.cpp', line = %d, locations = 1" %
+ self.line2)
+ self.expect("breakpoint set -f main.cpp -l %d" % self.line3,
+ BREAKPOINT_CREATED,
+ startstr = "Breakpoint created: 2: file ='main.cpp', line = %d, locations = 1" %
+ self.line3)
+
+ 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)
+
+ self.runCmd("command script import ./ftsp.py --allow-reload")
+ self.runCmd("type synth add -l ftsp.ftsp wrapint")
+
+ # we need to check that the VO is properly updated so that the same synthetic children are reused
+ # but their values change correctly across stop-points - in order to do this, self.runCmd("next")
+ # does not work because it forces a wipe of the stack frame - this is why we are using this more contrived
+ # mechanism to achieve our goal of preserving test_cast as a VO
+ test_cast = self.dbg.GetSelectedTarget().GetProcess().GetSelectedThread().GetSelectedFrame().FindVariable('test_cast')
+
+ str_cast = str(test_cast)
+
+ if self.TraceOn():
+ print str_cast
+
+ self.assertTrue(str_cast.find('A') != -1, 'could not find A in output')
+ self.assertTrue(str_cast.find('B') != -1, 'could not find B in output')
+ self.assertTrue(str_cast.find('C') != -1, 'could not find C in output')
+ self.assertTrue(str_cast.find('D') != -1, 'could not find D in output')
+ self.assertTrue(str_cast.find("4 = '\\0'") != -1, 'could not find item 4 == 0')
+
+ self.dbg.GetSelectedTarget().GetProcess().GetSelectedThread().StepOver()
+
+ str_cast = str(test_cast)
+
+ if self.TraceOn():
+ print str_cast
+
+ # we detect that all the values of the child objects have changed - but the counter-generated item
+ # is still fixed at 0 because it is cached - this would fail if update(self): in ftsp returned False
+ # or if synthetic children were not being preserved
+ self.assertTrue(str_cast.find('Q') != -1, 'could not find Q in output')
+ self.assertTrue(str_cast.find('X') != -1, 'could not find X in output')
+ self.assertTrue(str_cast.find('T') != -1, 'could not find T in output')
+ self.assertTrue(str_cast.find('F') != -1, 'could not find F in output')
+ self.assertTrue(str_cast.find("4 = '\\0'") != -1, 'could not find item 4 == 0')
+
if __name__ == '__main__':
import atexit
diff --git a/lldb/test/functionalities/data-formatter/data-formatter-python-synth/fooSynthProvider.py b/lldb/test/functionalities/data-formatter/data-formatter-python-synth/fooSynthProvider.py
index fb95ac2b54d..0dc2c233e2a 100644
--- a/lldb/test/functionalities/data-formatter/data-formatter-python-synth/fooSynthProvider.py
+++ b/lldb/test/functionalities/data-formatter/data-formatter-python-synth/fooSynthProvider.py
@@ -1,21 +1,23 @@
import lldb
class fooSynthProvider:
- def __init__(self, valobj, dict):
- self.valobj = valobj;
- self.int_type = valobj.GetType().GetBasicType(lldb.eBasicTypeInt)
- def num_children(self):
- return 3;
- def get_child_at_index(self, index):
- if index == 0:
- child = self.valobj.GetChildMemberWithName('a');
- if index == 1:
- child = self.valobj.CreateChildAtOffset ('fake_a', 1, self.int_type);
- if index == 2:
- child = self.valobj.GetChildMemberWithName('r');
- return child;
- def get_child_index(self, name):
- if name == 'a':
- return 0;
- if name == 'fake_a':
- return 1;
- return 2;
+ def __init__(self, valobj, dict):
+ self.valobj = valobj;
+ self.int_type = valobj.GetType().GetBasicType(lldb.eBasicTypeInt)
+ def num_children(self):
+ return 3;
+ def get_child_at_index(self, index):
+ if index == 0:
+ child = self.valobj.GetChildMemberWithName('a');
+ if index == 1:
+ child = self.valobj.CreateChildAtOffset ('fake_a', 1, self.int_type);
+ if index == 2:
+ child = self.valobj.GetChildMemberWithName('r');
+ return child;
+ def get_child_index(self, name):
+ if name == 'a':
+ return 0;
+ if name == 'fake_a':
+ return 1;
+ return 2;
+ def update(self):
+ return True \ No newline at end of file
diff --git a/lldb/test/functionalities/data-formatter/data-formatter-python-synth/ftsp.py b/lldb/test/functionalities/data-formatter/data-formatter-python-synth/ftsp.py
index f618672deaa..d162b00db32 100644
--- a/lldb/test/functionalities/data-formatter/data-formatter-python-synth/ftsp.py
+++ b/lldb/test/functionalities/data-formatter/data-formatter-python-synth/ftsp.py
@@ -1,20 +1,32 @@
import lldb
+
+counter = 0
+
class ftsp:
def __init__(self, valobj, dict):
self.valobj = valobj;
- self.update()
def num_children(self):
if self.char.IsValid():
- return 4;
+ return 5;
return 0;
def get_child_index(self,name):
return 0;
def get_child_at_index(self,index):
if index == 0:
return self.x.Cast(self.char)
+ if index == 4:
+ return self.valobj.CreateValueFromExpression(str(index),'(char)('+str(self.count)+')')
return self.x.CreateChildAtOffset(str(index),
index,
self.char);
def update(self):
self.x = self.valobj.GetChildMemberWithName('x');
self.char = self.valobj.GetType().GetBasicType(lldb.eBasicTypeChar)
+ global counter
+ self.count = counter
+ counter = counter + 1
+ return True # important: if we return False here, or fail to return, the test will fail
+
+def __lldb_init_module(debugger, dict):
+ global counter
+ counter = 0 \ No newline at end of file
diff --git a/lldb/test/functionalities/data-formatter/data-formatter-python-synth/main.cpp b/lldb/test/functionalities/data-formatter/data-formatter-python-synth/main.cpp
index b921915b91c..c09630db158 100644
--- a/lldb/test/functionalities/data-formatter/data-formatter-python-synth/main.cpp
+++ b/lldb/test/functionalities/data-formatter/data-formatter-python-synth/main.cpp
@@ -57,6 +57,11 @@ int main()
256*'B' +
256*256*'C'+
256*256*256*'D');
-
+ // Set cast break point at this line.
+ test_cast.x = 'Q' +
+ 256*'X' +
+ 256*256*'T'+
+ 256*256*256*'F';
+ // Set second cast break point at this line.
return 0;
} \ No newline at end of file
OpenPOWER on IntegriCloud