1c15fb8cd49dd876f992f7fa2d3984c0d93c17cf1Enrico Granata"""
2c15fb8cd49dd876f992f7fa2d3984c0d93c17cf1Enrico GranataTest lldb data formatter subsystem.
3c15fb8cd49dd876f992f7fa2d3984c0d93c17cf1Enrico Granata"""
4c15fb8cd49dd876f992f7fa2d3984c0d93c17cf1Enrico Granata
5c15fb8cd49dd876f992f7fa2d3984c0d93c17cf1Enrico Granataimport os, time
6c15fb8cd49dd876f992f7fa2d3984c0d93c17cf1Enrico Granataimport unittest2
7c15fb8cd49dd876f992f7fa2d3984c0d93c17cf1Enrico Granataimport lldb
8c15fb8cd49dd876f992f7fa2d3984c0d93c17cf1Enrico Granatafrom lldbtest import *
9c15fb8cd49dd876f992f7fa2d3984c0d93c17cf1Enrico Granataimport lldbutil
10c15fb8cd49dd876f992f7fa2d3984c0d93c17cf1Enrico Granata
11c15fb8cd49dd876f992f7fa2d3984c0d93c17cf1Enrico Granataclass ValueObjectRecursionTestCase(TestBase):
12c15fb8cd49dd876f992f7fa2d3984c0d93c17cf1Enrico Granata
13c15fb8cd49dd876f992f7fa2d3984c0d93c17cf1Enrico Granata    mydir = os.path.join("functionalities", "recursion")
14c15fb8cd49dd876f992f7fa2d3984c0d93c17cf1Enrico Granata
15c15fb8cd49dd876f992f7fa2d3984c0d93c17cf1Enrico Granata    @unittest2.skipUnless(sys.platform.startswith("darwin"), "requires Darwin")
16c15fb8cd49dd876f992f7fa2d3984c0d93c17cf1Enrico Granata    @dsym_test
17c15fb8cd49dd876f992f7fa2d3984c0d93c17cf1Enrico Granata    def test_with_dsym_and_run_command(self):
18c15fb8cd49dd876f992f7fa2d3984c0d93c17cf1Enrico Granata        """Test that deeply nested ValueObjects still work."""
19c15fb8cd49dd876f992f7fa2d3984c0d93c17cf1Enrico Granata        self.buildDsym()
20c15fb8cd49dd876f992f7fa2d3984c0d93c17cf1Enrico Granata        self.recursive_vo_commands()
21c15fb8cd49dd876f992f7fa2d3984c0d93c17cf1Enrico Granata
22c15fb8cd49dd876f992f7fa2d3984c0d93c17cf1Enrico Granata    @dwarf_test
23c15fb8cd49dd876f992f7fa2d3984c0d93c17cf1Enrico Granata    def test_with_dwarf_and_run_command(self):
24c15fb8cd49dd876f992f7fa2d3984c0d93c17cf1Enrico Granata        """Test that deeply nested ValueObjects still work."""
25c15fb8cd49dd876f992f7fa2d3984c0d93c17cf1Enrico Granata        self.buildDwarf()
26c15fb8cd49dd876f992f7fa2d3984c0d93c17cf1Enrico Granata        self.recursive_vo_commands()
27c15fb8cd49dd876f992f7fa2d3984c0d93c17cf1Enrico Granata
28c15fb8cd49dd876f992f7fa2d3984c0d93c17cf1Enrico Granata    def setUp(self):
29c15fb8cd49dd876f992f7fa2d3984c0d93c17cf1Enrico Granata        # Call super's setUp().
30c15fb8cd49dd876f992f7fa2d3984c0d93c17cf1Enrico Granata        TestBase.setUp(self)
31c15fb8cd49dd876f992f7fa2d3984c0d93c17cf1Enrico Granata        # Find the line number to break at.
32c15fb8cd49dd876f992f7fa2d3984c0d93c17cf1Enrico Granata        self.line = line_number('main.cpp', '// Set break point at this line.')
33c15fb8cd49dd876f992f7fa2d3984c0d93c17cf1Enrico Granata
34c15fb8cd49dd876f992f7fa2d3984c0d93c17cf1Enrico Granata    def recursive_vo_commands(self):
35c15fb8cd49dd876f992f7fa2d3984c0d93c17cf1Enrico Granata        """Test that that file and class static variables display correctly."""
36c15fb8cd49dd876f992f7fa2d3984c0d93c17cf1Enrico Granata        self.runCmd("file a.out", CURRENT_EXECUTABLE_SET)
37c15fb8cd49dd876f992f7fa2d3984c0d93c17cf1Enrico Granata
38c15fb8cd49dd876f992f7fa2d3984c0d93c17cf1Enrico Granata        lldbutil.run_break_set_by_file_and_line (self, "main.cpp", self.line, num_expected_locations=1, loc_exact=True)
39c15fb8cd49dd876f992f7fa2d3984c0d93c17cf1Enrico Granata
40c15fb8cd49dd876f992f7fa2d3984c0d93c17cf1Enrico Granata        self.runCmd("run", RUN_SUCCEEDED)
41c15fb8cd49dd876f992f7fa2d3984c0d93c17cf1Enrico Granata
42c15fb8cd49dd876f992f7fa2d3984c0d93c17cf1Enrico Granata        # The stop reason of the thread should be breakpoint.
43c15fb8cd49dd876f992f7fa2d3984c0d93c17cf1Enrico Granata        self.expect("thread list", STOPPED_DUE_TO_BREAKPOINT,
44c15fb8cd49dd876f992f7fa2d3984c0d93c17cf1Enrico Granata            substrs = ['stopped',
45c15fb8cd49dd876f992f7fa2d3984c0d93c17cf1Enrico Granata                       'stop reason = breakpoint'])
46c15fb8cd49dd876f992f7fa2d3984c0d93c17cf1Enrico Granata
47c15fb8cd49dd876f992f7fa2d3984c0d93c17cf1Enrico Granata        # This is the function to remove the custom formats in order to have a
48c15fb8cd49dd876f992f7fa2d3984c0d93c17cf1Enrico Granata        # clean slate for the next test case.
49c15fb8cd49dd876f992f7fa2d3984c0d93c17cf1Enrico Granata        def cleanup():
50c15fb8cd49dd876f992f7fa2d3984c0d93c17cf1Enrico Granata            self.runCmd('type format clear', check=False)
51c15fb8cd49dd876f992f7fa2d3984c0d93c17cf1Enrico Granata            self.runCmd('type summary clear', check=False)
52c15fb8cd49dd876f992f7fa2d3984c0d93c17cf1Enrico Granata
53c15fb8cd49dd876f992f7fa2d3984c0d93c17cf1Enrico Granata        # Execute the cleanup function during test case tear down.
54c15fb8cd49dd876f992f7fa2d3984c0d93c17cf1Enrico Granata        self.addTearDownHook(cleanup)
55c15fb8cd49dd876f992f7fa2d3984c0d93c17cf1Enrico Granata
56c15fb8cd49dd876f992f7fa2d3984c0d93c17cf1Enrico Granata        root = self.frame().FindVariable("root")
57c15fb8cd49dd876f992f7fa2d3984c0d93c17cf1Enrico Granata        child = root.GetChildAtIndex(1)
58c15fb8cd49dd876f992f7fa2d3984c0d93c17cf1Enrico Granata        if self.TraceOn():
59c15fb8cd49dd876f992f7fa2d3984c0d93c17cf1Enrico Granata             print root
60c15fb8cd49dd876f992f7fa2d3984c0d93c17cf1Enrico Granata             print child
61c15fb8cd49dd876f992f7fa2d3984c0d93c17cf1Enrico Granata        for i in range(0,24500):
62c15fb8cd49dd876f992f7fa2d3984c0d93c17cf1Enrico Granata             child = child.GetChildAtIndex(1)
63c15fb8cd49dd876f992f7fa2d3984c0d93c17cf1Enrico Granata        if self.TraceOn():
64c15fb8cd49dd876f992f7fa2d3984c0d93c17cf1Enrico Granata             print child
65c15fb8cd49dd876f992f7fa2d3984c0d93c17cf1Enrico Granata        self.assertTrue(child.IsValid(),"could not retrieve the deep ValueObject")
66c15fb8cd49dd876f992f7fa2d3984c0d93c17cf1Enrico Granata        self.assertTrue(child.GetChildAtIndex(0).IsValid(),"the deep ValueObject has no value")
67c15fb8cd49dd876f992f7fa2d3984c0d93c17cf1Enrico Granata        self.assertTrue(child.GetChildAtIndex(0).GetValueAsUnsigned() != 0,"the deep ValueObject has a zero value")
68c15fb8cd49dd876f992f7fa2d3984c0d93c17cf1Enrico Granata        self.assertTrue(child.GetChildAtIndex(1).GetValueAsUnsigned() != 0, "the deep ValueObject has no next")
69c15fb8cd49dd876f992f7fa2d3984c0d93c17cf1Enrico Granata
70c15fb8cd49dd876f992f7fa2d3984c0d93c17cf1Enrico Granataif __name__ == '__main__':
71c15fb8cd49dd876f992f7fa2d3984c0d93c17cf1Enrico Granata    import atexit
72c15fb8cd49dd876f992f7fa2d3984c0d93c17cf1Enrico Granata    lldb.SBDebugger.Initialize()
73c15fb8cd49dd876f992f7fa2d3984c0d93c17cf1Enrico Granata    atexit.register(lambda: lldb.SBDebugger.Terminate())
74c15fb8cd49dd876f992f7fa2d3984c0d93c17cf1Enrico Granata    unittest2.main()
75