17f163b363aeccffeec8eda23bd31e4965abc7226Enrico Granata"""
27f163b363aeccffeec8eda23bd31e4965abc7226Enrico GranataTest lldb data formatter subsystem.
37f163b363aeccffeec8eda23bd31e4965abc7226Enrico Granata"""
47f163b363aeccffeec8eda23bd31e4965abc7226Enrico Granata
57f163b363aeccffeec8eda23bd31e4965abc7226Enrico Granataimport os, time
67f163b363aeccffeec8eda23bd31e4965abc7226Enrico Granataimport unittest2
77f163b363aeccffeec8eda23bd31e4965abc7226Enrico Granataimport lldb
87f163b363aeccffeec8eda23bd31e4965abc7226Enrico Granatafrom lldbtest import *
9431d839a33e9a274e705f7a268a1c9de2ffc2da2Jim Inghamimport lldbutil
107f163b363aeccffeec8eda23bd31e4965abc7226Enrico Granata
1192f75728050db93bfaf3e73d86a4a8a3a75dad8aJohnny Chenclass SkipSummaryDataFormatterTestCase(TestBase):
127f163b363aeccffeec8eda23bd31e4965abc7226Enrico Granata
137f163b363aeccffeec8eda23bd31e4965abc7226Enrico Granata    mydir = os.path.join("functionalities", "data-formatter", "data-formatter-skip-summary")
147f163b363aeccffeec8eda23bd31e4965abc7226Enrico Granata
157f163b363aeccffeec8eda23bd31e4965abc7226Enrico Granata    @unittest2.skipUnless(sys.platform.startswith("darwin"), "requires Darwin")
16a3ed7d834b0e0c6924ac95629e740682bbcd15baJohnny Chen    @dsym_test
177f163b363aeccffeec8eda23bd31e4965abc7226Enrico Granata    def test_with_dsym_and_run_command(self):
187f163b363aeccffeec8eda23bd31e4965abc7226Enrico Granata        """Test data formatter commands."""
197f163b363aeccffeec8eda23bd31e4965abc7226Enrico Granata        self.buildDsym()
207f163b363aeccffeec8eda23bd31e4965abc7226Enrico Granata        self.data_formatter_commands()
217f163b363aeccffeec8eda23bd31e4965abc7226Enrico Granata
22a3ed7d834b0e0c6924ac95629e740682bbcd15baJohnny Chen    @dwarf_test
237f163b363aeccffeec8eda23bd31e4965abc7226Enrico Granata    def test_with_dwarf_and_run_command(self):
247f163b363aeccffeec8eda23bd31e4965abc7226Enrico Granata        """Test data formatter commands."""
257f163b363aeccffeec8eda23bd31e4965abc7226Enrico Granata        self.buildDwarf()
267f163b363aeccffeec8eda23bd31e4965abc7226Enrico Granata        self.data_formatter_commands()
277f163b363aeccffeec8eda23bd31e4965abc7226Enrico Granata
287f163b363aeccffeec8eda23bd31e4965abc7226Enrico Granata    def setUp(self):
297f163b363aeccffeec8eda23bd31e4965abc7226Enrico Granata        # Call super's setUp().
307f163b363aeccffeec8eda23bd31e4965abc7226Enrico Granata        TestBase.setUp(self)
317f163b363aeccffeec8eda23bd31e4965abc7226Enrico Granata        # Find the line number to break at.
327f163b363aeccffeec8eda23bd31e4965abc7226Enrico Granata        self.line = line_number('main.cpp', '// Set break point at this line.')
337f163b363aeccffeec8eda23bd31e4965abc7226Enrico Granata
347f163b363aeccffeec8eda23bd31e4965abc7226Enrico Granata    def data_formatter_commands(self):
357f163b363aeccffeec8eda23bd31e4965abc7226Enrico Granata        """Test that that file and class static variables display correctly."""
367f163b363aeccffeec8eda23bd31e4965abc7226Enrico Granata        self.runCmd("file a.out", CURRENT_EXECUTABLE_SET)
377f163b363aeccffeec8eda23bd31e4965abc7226Enrico Granata
38431d839a33e9a274e705f7a268a1c9de2ffc2da2Jim Ingham        #import lldbutil
39431d839a33e9a274e705f7a268a1c9de2ffc2da2Jim Ingham        lldbutil.run_break_set_by_file_and_line (self, "main.cpp", self.line, num_expected_locations=1, loc_exact=True)
40431d839a33e9a274e705f7a268a1c9de2ffc2da2Jim Ingham
417f163b363aeccffeec8eda23bd31e4965abc7226Enrico Granata
427f163b363aeccffeec8eda23bd31e4965abc7226Enrico Granata        self.runCmd("run", RUN_SUCCEEDED)
437f163b363aeccffeec8eda23bd31e4965abc7226Enrico Granata
447f163b363aeccffeec8eda23bd31e4965abc7226Enrico Granata        # The stop reason of the thread should be breakpoint.
457f163b363aeccffeec8eda23bd31e4965abc7226Enrico Granata        self.expect("thread list", STOPPED_DUE_TO_BREAKPOINT,
467f163b363aeccffeec8eda23bd31e4965abc7226Enrico Granata            substrs = ['stopped',
477f163b363aeccffeec8eda23bd31e4965abc7226Enrico Granata                       'stop reason = breakpoint'])
487f163b363aeccffeec8eda23bd31e4965abc7226Enrico Granata
497f163b363aeccffeec8eda23bd31e4965abc7226Enrico Granata        # This is the function to remove the custom formats in order to have a
507f163b363aeccffeec8eda23bd31e4965abc7226Enrico Granata        # clean slate for the next test case.
517f163b363aeccffeec8eda23bd31e4965abc7226Enrico Granata        def cleanup():
527f163b363aeccffeec8eda23bd31e4965abc7226Enrico Granata            self.runCmd('type format clear', check=False)
537f163b363aeccffeec8eda23bd31e4965abc7226Enrico Granata            self.runCmd('type summary clear', check=False)
547f163b363aeccffeec8eda23bd31e4965abc7226Enrico Granata
557f163b363aeccffeec8eda23bd31e4965abc7226Enrico Granata        # Execute the cleanup function during test case tear down.
567f163b363aeccffeec8eda23bd31e4965abc7226Enrico Granata        self.addTearDownHook(cleanup)
577f163b363aeccffeec8eda23bd31e4965abc7226Enrico Granata
587f163b363aeccffeec8eda23bd31e4965abc7226Enrico Granata        # Setup the summaries for this scenario
59242ffb80dd0c1c650c8a9f05656a3ba2f339993dEnrico Granata        #self.runCmd("type summary add --summary-string \"${var._M_dataplus._M_p}\" std::string")
60242ffb80dd0c1c650c8a9f05656a3ba2f339993dEnrico Granata        self.runCmd("type summary add --summary-string \"Level 1\" \"DeepData_1\"")
61242ffb80dd0c1c650c8a9f05656a3ba2f339993dEnrico Granata        self.runCmd("type summary add --summary-string \"Level 2\" \"DeepData_2\" -e")
62242ffb80dd0c1c650c8a9f05656a3ba2f339993dEnrico Granata        self.runCmd("type summary add --summary-string \"Level 3\" \"DeepData_3\"")
63242ffb80dd0c1c650c8a9f05656a3ba2f339993dEnrico Granata        self.runCmd("type summary add --summary-string \"Level 4\" \"DeepData_4\"")
64242ffb80dd0c1c650c8a9f05656a3ba2f339993dEnrico Granata        self.runCmd("type summary add --summary-string \"Level 5\" \"DeepData_5\"")
657f163b363aeccffeec8eda23bd31e4965abc7226Enrico Granata
667f163b363aeccffeec8eda23bd31e4965abc7226Enrico Granata        # Default case, just print out summaries
677f163b363aeccffeec8eda23bd31e4965abc7226Enrico Granata        self.expect('frame variable',
687f163b363aeccffeec8eda23bd31e4965abc7226Enrico Granata            substrs = ['(DeepData_1) data1 = Level 1',
697f163b363aeccffeec8eda23bd31e4965abc7226Enrico Granata                       '(DeepData_2) data2 = Level 2 {',
707f163b363aeccffeec8eda23bd31e4965abc7226Enrico Granata                       'm_child1 = Level 3',
717f163b363aeccffeec8eda23bd31e4965abc7226Enrico Granata                       'm_child2 = Level 3',
727f163b363aeccffeec8eda23bd31e4965abc7226Enrico Granata                       'm_child3 = Level 3',
737f163b363aeccffeec8eda23bd31e4965abc7226Enrico Granata                       'm_child4 = Level 3',
747f163b363aeccffeec8eda23bd31e4965abc7226Enrico Granata                       '}'])
757f163b363aeccffeec8eda23bd31e4965abc7226Enrico Granata
767f163b363aeccffeec8eda23bd31e4965abc7226Enrico Granata        # Skip the default (should be 1) levels of summaries
776475c42148a8ea1ca86e5db465db7eca742d897dGreg Clayton        self.expect('frame variable --no-summary-depth',
787f163b363aeccffeec8eda23bd31e4965abc7226Enrico Granata            substrs = ['(DeepData_1) data1 = {',
797f163b363aeccffeec8eda23bd31e4965abc7226Enrico Granata                       'm_child1 = 0x',
807f163b363aeccffeec8eda23bd31e4965abc7226Enrico Granata                       '}',
817f163b363aeccffeec8eda23bd31e4965abc7226Enrico Granata                       '(DeepData_2) data2 = {',
827f163b363aeccffeec8eda23bd31e4965abc7226Enrico Granata                       'm_child1 = Level 3',
837f163b363aeccffeec8eda23bd31e4965abc7226Enrico Granata                       'm_child2 = Level 3',
847f163b363aeccffeec8eda23bd31e4965abc7226Enrico Granata                       'm_child3 = Level 3',
857f163b363aeccffeec8eda23bd31e4965abc7226Enrico Granata                       'm_child4 = Level 3',
867f163b363aeccffeec8eda23bd31e4965abc7226Enrico Granata                       '}'])
877f163b363aeccffeec8eda23bd31e4965abc7226Enrico Granata
887f163b363aeccffeec8eda23bd31e4965abc7226Enrico Granata        # Now skip 2 levels of summaries
896475c42148a8ea1ca86e5db465db7eca742d897dGreg Clayton        self.expect('frame variable --no-summary-depth=2',
907f163b363aeccffeec8eda23bd31e4965abc7226Enrico Granata            substrs = ['(DeepData_1) data1 = {',
917f163b363aeccffeec8eda23bd31e4965abc7226Enrico Granata                       'm_child1 = 0x',
927f163b363aeccffeec8eda23bd31e4965abc7226Enrico Granata                       '}',
937f163b363aeccffeec8eda23bd31e4965abc7226Enrico Granata                       '(DeepData_2) data2 = {',
947f163b363aeccffeec8eda23bd31e4965abc7226Enrico Granata                       'm_child1 = {',
957f163b363aeccffeec8eda23bd31e4965abc7226Enrico Granata                       'm_child1 = 0x',
967f163b363aeccffeec8eda23bd31e4965abc7226Enrico Granata                       'Level 4',
977f163b363aeccffeec8eda23bd31e4965abc7226Enrico Granata                       'm_child2 = {',
987f163b363aeccffeec8eda23bd31e4965abc7226Enrico Granata                       'm_child3 = {',
997f163b363aeccffeec8eda23bd31e4965abc7226Enrico Granata                       '}'])
1007f163b363aeccffeec8eda23bd31e4965abc7226Enrico Granata
1017f163b363aeccffeec8eda23bd31e4965abc7226Enrico Granata        # Check that no "Level 3" comes out
1026475c42148a8ea1ca86e5db465db7eca742d897dGreg Clayton        self.expect('frame variable data1.m_child1 --no-summary-depth=2', matching=False,
1037f163b363aeccffeec8eda23bd31e4965abc7226Enrico Granata            substrs = ['Level 3'])
1047f163b363aeccffeec8eda23bd31e4965abc7226Enrico Granata
1057f163b363aeccffeec8eda23bd31e4965abc7226Enrico Granata        # Now expand a pointer with 2 level of skipped summaries
1066475c42148a8ea1ca86e5db465db7eca742d897dGreg Clayton        self.expect('frame variable data1.m_child1 --no-summary-depth=2',
1077f163b363aeccffeec8eda23bd31e4965abc7226Enrico Granata                    substrs = ['(DeepData_2 *) data1.m_child1 = 0x'])
1087f163b363aeccffeec8eda23bd31e4965abc7226Enrico Granata
1097f163b363aeccffeec8eda23bd31e4965abc7226Enrico Granata        # Deref and expand said pointer
1106475c42148a8ea1ca86e5db465db7eca742d897dGreg Clayton        self.expect('frame variable *data1.m_child1 --no-summary-depth=2',
1117f163b363aeccffeec8eda23bd31e4965abc7226Enrico Granata                    substrs = ['(DeepData_2) *data1.m_child1 = {',
1127f163b363aeccffeec8eda23bd31e4965abc7226Enrico Granata                               'm_child2 = {',
1137f163b363aeccffeec8eda23bd31e4965abc7226Enrico Granata                               'm_child1 = 0x',
1147f163b363aeccffeec8eda23bd31e4965abc7226Enrico Granata                               'Level 4',
1157f163b363aeccffeec8eda23bd31e4965abc7226Enrico Granata                               '}'])
1167f163b363aeccffeec8eda23bd31e4965abc7226Enrico Granata
1177f163b363aeccffeec8eda23bd31e4965abc7226Enrico Granata        # Expand an expression, skipping 2 layers of summaries
1186475c42148a8ea1ca86e5db465db7eca742d897dGreg Clayton        self.expect('frame variable data1.m_child1->m_child2 --no-summary-depth=2',
1197f163b363aeccffeec8eda23bd31e4965abc7226Enrico Granata                substrs = ['(DeepData_3) data1.m_child1->m_child2 = {',
1207f163b363aeccffeec8eda23bd31e4965abc7226Enrico Granata                           'm_child2 = {',
1217f163b363aeccffeec8eda23bd31e4965abc7226Enrico Granata                           'm_child1 = Level 5',
1227f163b363aeccffeec8eda23bd31e4965abc7226Enrico Granata                           'm_child2 = Level 5',
1237f163b363aeccffeec8eda23bd31e4965abc7226Enrico Granata                           'm_child3 = Level 5',
1247f163b363aeccffeec8eda23bd31e4965abc7226Enrico Granata                           '}'])
1257f163b363aeccffeec8eda23bd31e4965abc7226Enrico Granata
1267f163b363aeccffeec8eda23bd31e4965abc7226Enrico Granata        # Expand same expression, skipping only 1 layer of summaries
1276475c42148a8ea1ca86e5db465db7eca742d897dGreg Clayton        self.expect('frame variable data1.m_child1->m_child2 --no-summary-depth=1',
1287f163b363aeccffeec8eda23bd31e4965abc7226Enrico Granata                    substrs = ['(DeepData_3) data1.m_child1->m_child2 = {',
1297f163b363aeccffeec8eda23bd31e4965abc7226Enrico Granata                               'm_child1 = 0x',
1307f163b363aeccffeec8eda23bd31e4965abc7226Enrico Granata                               'Level 4',
1317f163b363aeccffeec8eda23bd31e4965abc7226Enrico Granata                               'm_child2 = Level 4',
1327f163b363aeccffeec8eda23bd31e4965abc7226Enrico Granata                               '}'])
1337f163b363aeccffeec8eda23bd31e4965abc7226Enrico Granata
134da4d47907f205dcbfa728a652ef3c8b2cc206fe3Johnny Chen        # Bad debugging info on SnowLeopard gcc (Apple Inc. build 5666).
135da4d47907f205dcbfa728a652ef3c8b2cc206fe3Johnny Chen        # Skip the following tests if the condition is met.
136da4d47907f205dcbfa728a652ef3c8b2cc206fe3Johnny Chen        if self.getCompiler().endswith('gcc') and not self.getCompiler().endswith('llvm-gcc'):
137431d839a33e9a274e705f7a268a1c9de2ffc2da2Jim Ingham           import re
138da4d47907f205dcbfa728a652ef3c8b2cc206fe3Johnny Chen           gcc_version_output = system([lldbutil.which(self.getCompiler()), "-v"])[1]
139da4d47907f205dcbfa728a652ef3c8b2cc206fe3Johnny Chen           #print "my output:", gcc_version_output
140da4d47907f205dcbfa728a652ef3c8b2cc206fe3Johnny Chen           for line in gcc_version_output.split(os.linesep):
141da4d47907f205dcbfa728a652ef3c8b2cc206fe3Johnny Chen               m = re.search('\(Apple Inc\. build ([0-9]+)\)', line)
142da4d47907f205dcbfa728a652ef3c8b2cc206fe3Johnny Chen               #print "line:", line
143da4d47907f205dcbfa728a652ef3c8b2cc206fe3Johnny Chen               if m:
144da4d47907f205dcbfa728a652ef3c8b2cc206fe3Johnny Chen                   gcc_build = int(m.group(1))
145da4d47907f205dcbfa728a652ef3c8b2cc206fe3Johnny Chen                   #print "gcc build:", gcc_build
146da4d47907f205dcbfa728a652ef3c8b2cc206fe3Johnny Chen                   if gcc_build >= 5666:
147da4d47907f205dcbfa728a652ef3c8b2cc206fe3Johnny Chen                       # rdar://problem/9804600"
148da4d47907f205dcbfa728a652ef3c8b2cc206fe3Johnny Chen                       self.skipTest("rdar://problem/9804600 wrong namespace for std::string in debug info")
149da4d47907f205dcbfa728a652ef3c8b2cc206fe3Johnny Chen
1507f163b363aeccffeec8eda23bd31e4965abc7226Enrico Granata        # Expand same expression, skipping 3 layers of summaries
1516475c42148a8ea1ca86e5db465db7eca742d897dGreg Clayton        self.expect('frame variable data1.m_child1->m_child2 --show-types --no-summary-depth=3',
1527f163b363aeccffeec8eda23bd31e4965abc7226Enrico Granata                    substrs = ['(DeepData_3) data1.m_child1->m_child2 = {',
1537f163b363aeccffeec8eda23bd31e4965abc7226Enrico Granata                               'm_some_text = "Just a test"',
1547f163b363aeccffeec8eda23bd31e4965abc7226Enrico Granata                               'm_child2 = {',
1557f163b363aeccffeec8eda23bd31e4965abc7226Enrico Granata                               'm_some_text = "Just a test"'])
1567f163b363aeccffeec8eda23bd31e4965abc7226Enrico Granata
1577f163b363aeccffeec8eda23bd31e4965abc7226Enrico Granata        # Expand within a standard string (might depend on the implementation of the C++ stdlib you use)
1586475c42148a8ea1ca86e5db465db7eca742d897dGreg Clayton        self.expect('frame variable data1.m_child1->m_child2.m_child1.m_child2 --no-summary-depth=2',
1597f163b363aeccffeec8eda23bd31e4965abc7226Enrico Granata            substrs = ['(DeepData_5) data1.m_child1->m_child2.m_child1.m_child2 = {',
1607f163b363aeccffeec8eda23bd31e4965abc7226Enrico Granata                       'm_some_text = {',
1617f163b363aeccffeec8eda23bd31e4965abc7226Enrico Granata                       '_M_dataplus = {',
1627f163b363aeccffeec8eda23bd31e4965abc7226Enrico Granata                       '_M_p = 0x',
1637f163b363aeccffeec8eda23bd31e4965abc7226Enrico Granata                       '"Just a test"'])
1647f163b363aeccffeec8eda23bd31e4965abc7226Enrico Granata
1657f163b363aeccffeec8eda23bd31e4965abc7226Enrico Granata        # Repeat the above, but only skip 1 level of summaries
1666475c42148a8ea1ca86e5db465db7eca742d897dGreg Clayton        self.expect('frame variable data1.m_child1->m_child2.m_child1.m_child2 --no-summary-depth=1',
1677f163b363aeccffeec8eda23bd31e4965abc7226Enrico Granata                    substrs = ['(DeepData_5) data1.m_child1->m_child2.m_child1.m_child2 = {',
1687f163b363aeccffeec8eda23bd31e4965abc7226Enrico Granata                               'm_some_text = "Just a test"',
1697f163b363aeccffeec8eda23bd31e4965abc7226Enrico Granata                               '}'])
1707f163b363aeccffeec8eda23bd31e4965abc7226Enrico Granata
1716475c42148a8ea1ca86e5db465db7eca742d897dGreg Clayton        # Change summary and expand, first without --no-summary-depth then with --no-summary-depth
172242ffb80dd0c1c650c8a9f05656a3ba2f339993dEnrico Granata        self.runCmd("type summary add --summary-string \"${var.m_some_text}\" DeepData_5")
1737f163b363aeccffeec8eda23bd31e4965abc7226Enrico Granata
1747f163b363aeccffeec8eda23bd31e4965abc7226Enrico Granata        self.expect('fr var data2.m_child4.m_child2.m_child2',
1757f163b363aeccffeec8eda23bd31e4965abc7226Enrico Granata            substrs = ['(DeepData_5) data2.m_child4.m_child2.m_child2 = "Just a test"'])
1767f163b363aeccffeec8eda23bd31e4965abc7226Enrico Granata
1776475c42148a8ea1ca86e5db465db7eca742d897dGreg Clayton        self.expect('fr var data2.m_child4.m_child2.m_child2 --no-summary-depth',
1787f163b363aeccffeec8eda23bd31e4965abc7226Enrico Granata                    substrs = ['(DeepData_5) data2.m_child4.m_child2.m_child2 = {',
1797f163b363aeccffeec8eda23bd31e4965abc7226Enrico Granata                               'm_some_text = "Just a test"',
1807f163b363aeccffeec8eda23bd31e4965abc7226Enrico Granata                               '}'])
1817f163b363aeccffeec8eda23bd31e4965abc7226Enrico Granata
1827f163b363aeccffeec8eda23bd31e4965abc7226Enrico Granata
1837f163b363aeccffeec8eda23bd31e4965abc7226Enrico Granataif __name__ == '__main__':
1847f163b363aeccffeec8eda23bd31e4965abc7226Enrico Granata    import atexit
1857f163b363aeccffeec8eda23bd31e4965abc7226Enrico Granata    lldb.SBDebugger.Initialize()
1867f163b363aeccffeec8eda23bd31e4965abc7226Enrico Granata    atexit.register(lambda: lldb.SBDebugger.Terminate())
1877f163b363aeccffeec8eda23bd31e4965abc7226Enrico Granata    unittest2.main()
188