1d44c9d31d23d0b44ce40325ad69226889a9638bcEnrico Granata"""
2d44c9d31d23d0b44ce40325ad69226889a9638bcEnrico GranataCheck that types only get completed when necessary.
3d44c9d31d23d0b44ce40325ad69226889a9638bcEnrico Granata"""
4d44c9d31d23d0b44ce40325ad69226889a9638bcEnrico Granata
5d44c9d31d23d0b44ce40325ad69226889a9638bcEnrico Granataimport os, time
6d44c9d31d23d0b44ce40325ad69226889a9638bcEnrico Granataimport unittest2
7d44c9d31d23d0b44ce40325ad69226889a9638bcEnrico Granataimport lldb
8d44c9d31d23d0b44ce40325ad69226889a9638bcEnrico Granatafrom lldbtest import *
9431d839a33e9a274e705f7a268a1c9de2ffc2da2Jim Inghamimport lldbutil
10d44c9d31d23d0b44ce40325ad69226889a9638bcEnrico Granata
11d44c9d31d23d0b44ce40325ad69226889a9638bcEnrico Granataclass TypeCompletionTestCase(TestBase):
12d44c9d31d23d0b44ce40325ad69226889a9638bcEnrico Granata
13d44c9d31d23d0b44ce40325ad69226889a9638bcEnrico Granata    mydir = os.path.join("functionalities", "type_completion")
14d44c9d31d23d0b44ce40325ad69226889a9638bcEnrico Granata
15d44c9d31d23d0b44ce40325ad69226889a9638bcEnrico Granata    @unittest2.skipUnless(sys.platform.startswith("darwin"), "requires Darwin")
16a3ed7d834b0e0c6924ac95629e740682bbcd15baJohnny Chen    @dsym_test
17d44c9d31d23d0b44ce40325ad69226889a9638bcEnrico Granata    def test_with_dsym_and_run_command(self):
18d44c9d31d23d0b44ce40325ad69226889a9638bcEnrico Granata        """Check that types only get completed when necessary."""
19d44c9d31d23d0b44ce40325ad69226889a9638bcEnrico Granata        self.buildDsym()
20d44c9d31d23d0b44ce40325ad69226889a9638bcEnrico Granata        self.type_completion_commands()
21d44c9d31d23d0b44ce40325ad69226889a9638bcEnrico Granata
22a3ed7d834b0e0c6924ac95629e740682bbcd15baJohnny Chen    @dwarf_test
23e0fefe3f0ecc9a57e8d20c162c50ea70ee5d303bAshok Thirumurthi    @expectedFailureIcc # often fails with 'NameAndAddress should be valid'
242c0e3062e4b43015dc299270c9d73cdb00d384c1Ashok Thirumurthi    # Fails with gcc 4.8.1 with llvm.org/pr15301 LLDB prints incorrect sizes of STL containers
25d44c9d31d23d0b44ce40325ad69226889a9638bcEnrico Granata    def test_with_dwarf_and_run_command(self):
26d44c9d31d23d0b44ce40325ad69226889a9638bcEnrico Granata        """Check that types only get completed when necessary."""
27d44c9d31d23d0b44ce40325ad69226889a9638bcEnrico Granata        self.buildDwarf()
28d44c9d31d23d0b44ce40325ad69226889a9638bcEnrico Granata        self.type_completion_commands()
29d44c9d31d23d0b44ce40325ad69226889a9638bcEnrico Granata
30d44c9d31d23d0b44ce40325ad69226889a9638bcEnrico Granata    def setUp(self):
31d44c9d31d23d0b44ce40325ad69226889a9638bcEnrico Granata        # Call super's setUp().
32d44c9d31d23d0b44ce40325ad69226889a9638bcEnrico Granata        TestBase.setUp(self)
33d44c9d31d23d0b44ce40325ad69226889a9638bcEnrico Granata        # Find the line number to break at.
34d44c9d31d23d0b44ce40325ad69226889a9638bcEnrico Granata        self.line = line_number('main.cpp', '// Set break point at this line.')
35d44c9d31d23d0b44ce40325ad69226889a9638bcEnrico Granata
36d44c9d31d23d0b44ce40325ad69226889a9638bcEnrico Granata    def type_completion_commands(self):
37d44c9d31d23d0b44ce40325ad69226889a9638bcEnrico Granata        """Check that types only get completed when necessary."""
38d44c9d31d23d0b44ce40325ad69226889a9638bcEnrico Granata        self.runCmd("file a.out", CURRENT_EXECUTABLE_SET)
39d44c9d31d23d0b44ce40325ad69226889a9638bcEnrico Granata
40431d839a33e9a274e705f7a268a1c9de2ffc2da2Jim Ingham        lldbutil.run_break_set_by_file_and_line (self, "main.cpp", self.line, num_expected_locations=-1)
41d44c9d31d23d0b44ce40325ad69226889a9638bcEnrico Granata
42d44c9d31d23d0b44ce40325ad69226889a9638bcEnrico Granata        self.runCmd("run", RUN_SUCCEEDED)
43d44c9d31d23d0b44ce40325ad69226889a9638bcEnrico Granata
44d44c9d31d23d0b44ce40325ad69226889a9638bcEnrico Granata        # The stop reason of the thread should be breakpoint.
45d44c9d31d23d0b44ce40325ad69226889a9638bcEnrico Granata        self.expect("thread list", STOPPED_DUE_TO_BREAKPOINT,
46d44c9d31d23d0b44ce40325ad69226889a9638bcEnrico Granata            substrs = ['stopped',
47d44c9d31d23d0b44ce40325ad69226889a9638bcEnrico Granata                       'stop reason = breakpoint'])
48d44c9d31d23d0b44ce40325ad69226889a9638bcEnrico Granata
49d44c9d31d23d0b44ce40325ad69226889a9638bcEnrico Granata        # This is the function to remove the custom formats in order to have a
50d44c9d31d23d0b44ce40325ad69226889a9638bcEnrico Granata        # clean slate for the next test case.
51d44c9d31d23d0b44ce40325ad69226889a9638bcEnrico Granata        def cleanup():
52d44c9d31d23d0b44ce40325ad69226889a9638bcEnrico Granata            self.runCmd('type category enable gnu-libstdc++', check=False)
53944038ede7a3fd5db16deba31a479ef2c1f8e74dEnrico Granata            self.runCmd('type category enable libcxx', check=False)
54d44c9d31d23d0b44ce40325ad69226889a9638bcEnrico Granata
55d44c9d31d23d0b44ce40325ad69226889a9638bcEnrico Granata        self.runCmd('type category disable gnu-libstdc++', check=False)
56944038ede7a3fd5db16deba31a479ef2c1f8e74dEnrico Granata        self.runCmd('type category disable libcxx', check=False)
57d44c9d31d23d0b44ce40325ad69226889a9638bcEnrico Granata
58d44c9d31d23d0b44ce40325ad69226889a9638bcEnrico Granata        # Execute the cleanup function during test case tear down.
59d44c9d31d23d0b44ce40325ad69226889a9638bcEnrico Granata        self.addTearDownHook(cleanup)
60d44c9d31d23d0b44ce40325ad69226889a9638bcEnrico Granata
61d44c9d31d23d0b44ce40325ad69226889a9638bcEnrico Granata        p_vector = self.dbg.GetSelectedTarget().GetProcess().GetSelectedThread().GetSelectedFrame().FindVariable('p')
62d44c9d31d23d0b44ce40325ad69226889a9638bcEnrico Granata        p_type = p_vector.GetType()
63d44c9d31d23d0b44ce40325ad69226889a9638bcEnrico Granata        self.assertFalse(p_type.IsTypeComplete(), 'vector<T> complete but it should not be')
64d44c9d31d23d0b44ce40325ad69226889a9638bcEnrico Granata
65d44c9d31d23d0b44ce40325ad69226889a9638bcEnrico Granata        self.runCmd("next")
66d44c9d31d23d0b44ce40325ad69226889a9638bcEnrico Granata        self.runCmd("next")
67d44c9d31d23d0b44ce40325ad69226889a9638bcEnrico Granata
68d44c9d31d23d0b44ce40325ad69226889a9638bcEnrico Granata        p_vector = self.dbg.GetSelectedTarget().GetProcess().GetSelectedThread().GetSelectedFrame().FindVariable('p')
69d44c9d31d23d0b44ce40325ad69226889a9638bcEnrico Granata        p_type = p_vector.GetType()
70d44c9d31d23d0b44ce40325ad69226889a9638bcEnrico Granata        self.assertFalse(p_type.IsTypeComplete(), 'vector<T> complete but it should not be')
71d44c9d31d23d0b44ce40325ad69226889a9638bcEnrico Granata
72d44c9d31d23d0b44ce40325ad69226889a9638bcEnrico Granata        self.runCmd("next")
73d44c9d31d23d0b44ce40325ad69226889a9638bcEnrico Granata        self.runCmd("next")
74d44c9d31d23d0b44ce40325ad69226889a9638bcEnrico Granata
75d44c9d31d23d0b44ce40325ad69226889a9638bcEnrico Granata        self.runCmd("frame variable p --show-types")
76d44c9d31d23d0b44ce40325ad69226889a9638bcEnrico Granata
77d44c9d31d23d0b44ce40325ad69226889a9638bcEnrico Granata        p_vector = self.dbg.GetSelectedTarget().GetProcess().GetSelectedThread().GetSelectedFrame().FindVariable('p')
78d44c9d31d23d0b44ce40325ad69226889a9638bcEnrico Granata        p_type = p_vector.GetType()
79d44c9d31d23d0b44ce40325ad69226889a9638bcEnrico Granata        self.assertTrue(p_type.IsTypeComplete(), 'vector<T> should now be complete')
80d44c9d31d23d0b44ce40325ad69226889a9638bcEnrico Granata        name_address_type = p_type.GetTemplateArgumentType(0)
81d44c9d31d23d0b44ce40325ad69226889a9638bcEnrico Granata        self.assertTrue(name_address_type.IsValid(), 'NameAndAddress should be valid')
82d44c9d31d23d0b44ce40325ad69226889a9638bcEnrico Granata        self.assertFalse(name_address_type.IsTypeComplete(), 'NameAndAddress complete but it should not be')
83d44c9d31d23d0b44ce40325ad69226889a9638bcEnrico Granata
84d44c9d31d23d0b44ce40325ad69226889a9638bcEnrico Granata        self.runCmd("next")
85d44c9d31d23d0b44ce40325ad69226889a9638bcEnrico Granata        self.runCmd("next")
86d44c9d31d23d0b44ce40325ad69226889a9638bcEnrico Granata
87d44c9d31d23d0b44ce40325ad69226889a9638bcEnrico Granata        self.runCmd("frame variable guy --show-types")
88d44c9d31d23d0b44ce40325ad69226889a9638bcEnrico Granata
89d44c9d31d23d0b44ce40325ad69226889a9638bcEnrico Granata        p_vector = self.dbg.GetSelectedTarget().GetProcess().GetSelectedThread().GetSelectedFrame().FindVariable('p')
90d44c9d31d23d0b44ce40325ad69226889a9638bcEnrico Granata        p_type = p_vector.GetType()
91d44c9d31d23d0b44ce40325ad69226889a9638bcEnrico Granata        self.assertTrue(p_type.IsTypeComplete(), 'vector<T> should now be complete')
92d44c9d31d23d0b44ce40325ad69226889a9638bcEnrico Granata        name_address_type = p_type.GetTemplateArgumentType(0)
93d44c9d31d23d0b44ce40325ad69226889a9638bcEnrico Granata        self.assertTrue(name_address_type.IsValid(), 'NameAndAddress should be valid')
94d44c9d31d23d0b44ce40325ad69226889a9638bcEnrico Granata        self.assertTrue(name_address_type.IsTypeComplete(), 'NameAndAddress should now be complete')
95d44c9d31d23d0b44ce40325ad69226889a9638bcEnrico Granata        field0 = name_address_type.GetFieldAtIndex(0)
96d44c9d31d23d0b44ce40325ad69226889a9638bcEnrico Granata        if self.TraceOn():
97d44c9d31d23d0b44ce40325ad69226889a9638bcEnrico Granata             print 'field0: ' + str(field0)
98d44c9d31d23d0b44ce40325ad69226889a9638bcEnrico Granata        self.assertTrue(field0.IsValid(), 'NameAndAddress::m_name should be valid')
99d44c9d31d23d0b44ce40325ad69226889a9638bcEnrico Granata        string = field0.GetType().GetPointeeType()
100d44c9d31d23d0b44ce40325ad69226889a9638bcEnrico Granata        if self.TraceOn():
101d44c9d31d23d0b44ce40325ad69226889a9638bcEnrico Granata             print 'string: ' + str(string)
102d44c9d31d23d0b44ce40325ad69226889a9638bcEnrico Granata        self.assertTrue(string.IsValid(), 'std::string should be valid')
103d44c9d31d23d0b44ce40325ad69226889a9638bcEnrico Granata        self.assertFalse(string.IsTypeComplete(), 'std::string complete but it should not be')
104d44c9d31d23d0b44ce40325ad69226889a9638bcEnrico Granata
105d44c9d31d23d0b44ce40325ad69226889a9638bcEnrico Granata        self.runCmd("next")
106d44c9d31d23d0b44ce40325ad69226889a9638bcEnrico Granata        self.runCmd("next")
107d44c9d31d23d0b44ce40325ad69226889a9638bcEnrico Granata
108d44c9d31d23d0b44ce40325ad69226889a9638bcEnrico Granata        p_vector = self.dbg.GetSelectedTarget().GetProcess().GetSelectedThread().GetSelectedFrame().FindVariable('p')
109d44c9d31d23d0b44ce40325ad69226889a9638bcEnrico Granata        p_type = p_vector.GetType()
110d44c9d31d23d0b44ce40325ad69226889a9638bcEnrico Granata        self.assertTrue(p_type.IsTypeComplete(), 'vector<T> should now be complete')
111d44c9d31d23d0b44ce40325ad69226889a9638bcEnrico Granata        name_address_type = p_type.GetTemplateArgumentType(0)
112d44c9d31d23d0b44ce40325ad69226889a9638bcEnrico Granata        self.assertTrue(name_address_type.IsValid(), 'NameAndAddress should be valid')
113d44c9d31d23d0b44ce40325ad69226889a9638bcEnrico Granata        self.assertTrue(name_address_type.IsTypeComplete(), 'NameAndAddress should now be complete')
114d44c9d31d23d0b44ce40325ad69226889a9638bcEnrico Granata        field0 = name_address_type.GetFieldAtIndex(0)
115d44c9d31d23d0b44ce40325ad69226889a9638bcEnrico Granata        if self.TraceOn():
116d44c9d31d23d0b44ce40325ad69226889a9638bcEnrico Granata             print 'field0: ' + str(field0)
117d44c9d31d23d0b44ce40325ad69226889a9638bcEnrico Granata        self.assertTrue(field0.IsValid(), 'NameAndAddress::m_name should be valid')
118d44c9d31d23d0b44ce40325ad69226889a9638bcEnrico Granata        string = field0.GetType().GetPointeeType()
119d44c9d31d23d0b44ce40325ad69226889a9638bcEnrico Granata        if self.TraceOn():
120d44c9d31d23d0b44ce40325ad69226889a9638bcEnrico Granata             print 'string: ' + str(string)
121d44c9d31d23d0b44ce40325ad69226889a9638bcEnrico Granata        self.assertTrue(string.IsValid(), 'std::string should be valid')
122d44c9d31d23d0b44ce40325ad69226889a9638bcEnrico Granata        self.assertFalse(string.IsTypeComplete(), 'std::string complete but it should not be')
123d44c9d31d23d0b44ce40325ad69226889a9638bcEnrico Granata
124d44c9d31d23d0b44ce40325ad69226889a9638bcEnrico Granata        self.runCmd('type category enable gnu-libstdc++', check=False)
125944038ede7a3fd5db16deba31a479ef2c1f8e74dEnrico Granata        self.runCmd('type category enable libcxx', check=False)
126d44c9d31d23d0b44ce40325ad69226889a9638bcEnrico Granata        self.runCmd('frame variable guy --show-types')
127d44c9d31d23d0b44ce40325ad69226889a9638bcEnrico Granata
128d44c9d31d23d0b44ce40325ad69226889a9638bcEnrico Granata        p_vector = self.dbg.GetSelectedTarget().GetProcess().GetSelectedThread().GetSelectedFrame().FindVariable('p')
129d44c9d31d23d0b44ce40325ad69226889a9638bcEnrico Granata        p_type = p_vector.GetType()
130d44c9d31d23d0b44ce40325ad69226889a9638bcEnrico Granata        self.assertTrue(p_type.IsTypeComplete(), 'vector<T> should now be complete')
131d44c9d31d23d0b44ce40325ad69226889a9638bcEnrico Granata        name_address_type = p_type.GetTemplateArgumentType(0)
132d44c9d31d23d0b44ce40325ad69226889a9638bcEnrico Granata        self.assertTrue(name_address_type.IsValid(), 'NameAndAddress should be valid')
133d44c9d31d23d0b44ce40325ad69226889a9638bcEnrico Granata        self.assertTrue(name_address_type.IsTypeComplete(), 'NameAndAddress should now be complete')
134d44c9d31d23d0b44ce40325ad69226889a9638bcEnrico Granata        field0 = name_address_type.GetFieldAtIndex(0)
135d44c9d31d23d0b44ce40325ad69226889a9638bcEnrico Granata        self.assertTrue(field0.IsValid(), 'NameAndAddress::m_name should be valid')
136d44c9d31d23d0b44ce40325ad69226889a9638bcEnrico Granata        string = field0.GetType().GetPointeeType()
137d44c9d31d23d0b44ce40325ad69226889a9638bcEnrico Granata        self.assertTrue(string.IsValid(), 'std::string should be valid')
138d44c9d31d23d0b44ce40325ad69226889a9638bcEnrico Granata        self.assertTrue(string.IsTypeComplete(), 'std::string should now be complete')
139d44c9d31d23d0b44ce40325ad69226889a9638bcEnrico Granata
140d44c9d31d23d0b44ce40325ad69226889a9638bcEnrico Granataif __name__ == '__main__':
141d44c9d31d23d0b44ce40325ad69226889a9638bcEnrico Granata    import atexit
142d44c9d31d23d0b44ce40325ad69226889a9638bcEnrico Granata    lldb.SBDebugger.Initialize()
143d44c9d31d23d0b44ce40325ad69226889a9638bcEnrico Granata    atexit.register(lambda: lldb.SBDebugger.Terminate())
144d44c9d31d23d0b44ce40325ad69226889a9638bcEnrico Granata    unittest2.main()
145