15f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer"""
25f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid SpencerTest lldb data formatter subsystem.
35f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer"""
45f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
50bc735ffcfb223c0186419547abaa5c84482663eChris Lattnerimport os, time
60bc735ffcfb223c0186419547abaa5c84482663eChris Lattnerimport unittest2
75f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencerimport lldb
85f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencerfrom lldbtest import *
95f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencerimport lldbutil
105f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
115f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencerclass LibcxxVectorDataFormatterTestCase(TestBase):
125f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
135f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    mydir = os.path.join("functionalities", "data-formatter", "data-formatter-stl", "libcxx", "vector")
145f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
1527ceb9d77d929f02a8a811d189a96885629c7c0cChris Lattner    @unittest2.skipUnless(sys.platform.startswith("darwin"), "requires Darwin")
1627ceb9d77d929f02a8a811d189a96885629c7c0cChris Lattner    @dsym_test
1727ceb9d77d929f02a8a811d189a96885629c7c0cChris Lattner    def test_with_dsym_and_run_command(self):
1827ceb9d77d929f02a8a811d189a96885629c7c0cChris Lattner        """Test data formatter commands."""
1927ceb9d77d929f02a8a811d189a96885629c7c0cChris Lattner        self.buildDsym()
2027ceb9d77d929f02a8a811d189a96885629c7c0cChris Lattner        self.data_formatter_commands()
2127ceb9d77d929f02a8a811d189a96885629c7c0cChris Lattner
2227ceb9d77d929f02a8a811d189a96885629c7c0cChris Lattner    @skipIfLinux # No standard locations for libc++ on Linux, so skip for now
2327ceb9d77d929f02a8a811d189a96885629c7c0cChris Lattner    @dwarf_test
2443b628cd47ecdc3caf640d79b3ad7ecef0f2c285Chris Lattner    def test_with_dwarf_and_run_command(self):
255f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer        """Test data formatter commands."""
26f4c839657742b823cea1a95b18422f1ba74d3dddChris Lattner        self.buildDwarf()
2730bc96544346bea42921cf6837e66cef80d664b4Chris Lattner        self.data_formatter_commands()
2823e47c6b6e8ccdd8daa378ab2a879644425c72d8Daniel Dunbar
29182745ae7892bca0842d9c023370ade5f8d1c6e8Chris Lattner    def setUp(self):
30182745ae7892bca0842d9c023370ade5f8d1c6e8Chris Lattner        # Call super's setUp().
3187cf5ac1b046a1db874b77dcb6e35f9c4b88c386Chris Lattner        TestBase.setUp(self)
325f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer        # Find the line number to break at.
335f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer        self.line = line_number('main.cpp', '// Set break point at this line.')
34182745ae7892bca0842d9c023370ade5f8d1c6e8Chris Lattner        self.line2 = line_number('main.cpp', '// Set second break point at this line.')
35182745ae7892bca0842d9c023370ade5f8d1c6e8Chris Lattner
36182745ae7892bca0842d9c023370ade5f8d1c6e8Chris Lattner    def data_formatter_commands(self):
37182745ae7892bca0842d9c023370ade5f8d1c6e8Chris Lattner        """Test that that file and class static variables display correctly."""
38121f60c2aa51eae81eac75a9bd8c076140896f3dChris Lattner        self.runCmd("file a.out", CURRENT_EXECUTABLE_SET)
39121f60c2aa51eae81eac75a9bd8c076140896f3dChris Lattner
40121f60c2aa51eae81eac75a9bd8c076140896f3dChris Lattner        lldbutil.run_break_set_by_file_and_line (self, "main.cpp", self.line, num_expected_locations=-1)
41121f60c2aa51eae81eac75a9bd8c076140896f3dChris Lattner        lldbutil.run_break_set_by_file_and_line (self, "main.cpp", self.line2, num_expected_locations=-1)
42121f60c2aa51eae81eac75a9bd8c076140896f3dChris Lattner
43121f60c2aa51eae81eac75a9bd8c076140896f3dChris Lattner        self.runCmd("run", RUN_SUCCEEDED)
44121f60c2aa51eae81eac75a9bd8c076140896f3dChris Lattner
4527ceb9d77d929f02a8a811d189a96885629c7c0cChris Lattner        # The stop reason of the thread should be breakpoint.
4633dd2822f3972afe99b61315a890f8bad8ee5d7fChris Lattner        self.expect("thread list", STOPPED_DUE_TO_BREAKPOINT,
47121f60c2aa51eae81eac75a9bd8c076140896f3dChris Lattner            substrs = ['stopped',
48121f60c2aa51eae81eac75a9bd8c076140896f3dChris Lattner                       'stop reason = breakpoint'])
49121f60c2aa51eae81eac75a9bd8c076140896f3dChris Lattner
505e9f35c7cb61aea46f56d46c77cbcf47c0cf28baDouglas Gregor        # This is the function to remove the custom formats in order to have a
51121f60c2aa51eae81eac75a9bd8c076140896f3dChris Lattner        # clean slate for the next test case.
5233dd2822f3972afe99b61315a890f8bad8ee5d7fChris Lattner        def cleanup():
531eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump            self.runCmd('type format clear', check=False)
5487d854ebedb43a9ff0f55591821dc5600984e479Chris Lattner            self.runCmd('type summary clear', check=False)
5587d854ebedb43a9ff0f55591821dc5600984e479Chris Lattner            self.runCmd('type filter clear', check=False)
5687d854ebedb43a9ff0f55591821dc5600984e479Chris Lattner            self.runCmd('type synth clear', check=False)
5787d854ebedb43a9ff0f55591821dc5600984e479Chris Lattner            self.runCmd("settings set target.max-children-count 256", check=False)
5887d854ebedb43a9ff0f55591821dc5600984e479Chris Lattner
5987d854ebedb43a9ff0f55591821dc5600984e479Chris Lattner        # Execute the cleanup function during test case tear down.
6027ceb9d77d929f02a8a811d189a96885629c7c0cChris Lattner        self.addTearDownHook(cleanup)
6127ceb9d77d929f02a8a811d189a96885629c7c0cChris Lattner
6233dd2822f3972afe99b61315a890f8bad8ee5d7fChris Lattner        # empty vectors (and storage pointers SHOULD BOTH BE NULL..)
635e9f35c7cb61aea46f56d46c77cbcf47c0cf28baDouglas Gregor        self.expect("frame variable numbers",
645e9f35c7cb61aea46f56d46c77cbcf47c0cf28baDouglas Gregor            substrs = ['numbers = size=0'])
6527ceb9d77d929f02a8a811d189a96885629c7c0cChris Lattner
6627ceb9d77d929f02a8a811d189a96885629c7c0cChris Lattner        self.runCmd("n")
6727ceb9d77d929f02a8a811d189a96885629c7c0cChris Lattner
6827ceb9d77d929f02a8a811d189a96885629c7c0cChris Lattner        # first value added
6927ceb9d77d929f02a8a811d189a96885629c7c0cChris Lattner        self.expect("frame variable numbers",
7027ceb9d77d929f02a8a811d189a96885629c7c0cChris Lattner                    substrs = ['numbers = size=1',
7127ceb9d77d929f02a8a811d189a96885629c7c0cChris Lattner                               '[0] = 1',
7227ceb9d77d929f02a8a811d189a96885629c7c0cChris Lattner                               '}'])
735e9f35c7cb61aea46f56d46c77cbcf47c0cf28baDouglas Gregor
7427ceb9d77d929f02a8a811d189a96885629c7c0cChris Lattner        # add some more data
758a941e0c71d318430648e24eeca91a464a46eba9Chris Lattner        self.runCmd("n");self.runCmd("n");self.runCmd("n");
7627ceb9d77d929f02a8a811d189a96885629c7c0cChris Lattner
7787d854ebedb43a9ff0f55591821dc5600984e479Chris Lattner        self.expect("frame variable numbers",
7887d854ebedb43a9ff0f55591821dc5600984e479Chris Lattner                    substrs = ['numbers = size=4',
7933dd2822f3972afe99b61315a890f8bad8ee5d7fChris Lattner                               '[0] = 1',
8087d854ebedb43a9ff0f55591821dc5600984e479Chris Lattner                               '[1] = 12',
8187d854ebedb43a9ff0f55591821dc5600984e479Chris Lattner                               '[2] = 123',
8287d854ebedb43a9ff0f55591821dc5600984e479Chris Lattner                               '[3] = 1234',
8387d854ebedb43a9ff0f55591821dc5600984e479Chris Lattner                               '}'])
8487d854ebedb43a9ff0f55591821dc5600984e479Chris Lattner
8587d854ebedb43a9ff0f55591821dc5600984e479Chris Lattner        self.expect("p numbers",
865a3ce9b10c164d9bf75a70d429e55d4e171a9a9eChris Lattner                    substrs = ['$', 'size=4',
875a3ce9b10c164d9bf75a70d429e55d4e171a9a9eChris Lattner                               '[0] = 1',
885a3ce9b10c164d9bf75a70d429e55d4e171a9a9eChris Lattner                               '[1] = 12',
895a3ce9b10c164d9bf75a70d429e55d4e171a9a9eChris Lattner                               '[2] = 123',
905a3ce9b10c164d9bf75a70d429e55d4e171a9a9eChris Lattner                               '[3] = 1234',
9187d854ebedb43a9ff0f55591821dc5600984e479Chris Lattner                               '}'])
9287d854ebedb43a9ff0f55591821dc5600984e479Chris Lattner
935a3ce9b10c164d9bf75a70d429e55d4e171a9a9eChris Lattner
9487d854ebedb43a9ff0f55591821dc5600984e479Chris Lattner        # check access to synthetic children
9587d854ebedb43a9ff0f55591821dc5600984e479Chris Lattner        self.runCmd("type summary add --summary-string \"item 0 is ${var[0]}\" std::int_vect int_vect")
9687d854ebedb43a9ff0f55591821dc5600984e479Chris Lattner        self.expect('frame variable numbers',
971eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                    substrs = ['item 0 is 1']);
9887d854ebedb43a9ff0f55591821dc5600984e479Chris Lattner
995e9f35c7cb61aea46f56d46c77cbcf47c0cf28baDouglas Gregor        self.runCmd("type summary add --summary-string \"item 0 is ${svar[0]}\" std::int_vect int_vect")
1001eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump        self.expect('frame variable numbers',
10187d854ebedb43a9ff0f55591821dc5600984e479Chris Lattner                    substrs = ['item 0 is 1']);
10287d854ebedb43a9ff0f55591821dc5600984e479Chris Lattner        # move on with synths
10387d854ebedb43a9ff0f55591821dc5600984e479Chris Lattner        self.runCmd("type summary delete std::int_vect")
10487d854ebedb43a9ff0f55591821dc5600984e479Chris Lattner        self.runCmd("type summary delete int_vect")
10587d854ebedb43a9ff0f55591821dc5600984e479Chris Lattner
1061eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump        # add some more data
10787d854ebedb43a9ff0f55591821dc5600984e479Chris Lattner        self.runCmd("n");self.runCmd("n");self.runCmd("n");
10833dd2822f3972afe99b61315a890f8bad8ee5d7fChris Lattner
10933dd2822f3972afe99b61315a890f8bad8ee5d7fChris Lattner        self.expect("frame variable numbers",
11033dd2822f3972afe99b61315a890f8bad8ee5d7fChris Lattner                    substrs = ['numbers = size=7',
11133dd2822f3972afe99b61315a890f8bad8ee5d7fChris Lattner                               '[0] = 1',
112121f60c2aa51eae81eac75a9bd8c076140896f3dChris Lattner                               '[1] = 12',
113691f1ae7164ba78c3dd7ac20c487399935b9544bChris Lattner                               '[2] = 123',
114691f1ae7164ba78c3dd7ac20c487399935b9544bChris Lattner                               '[3] = 1234',
115691f1ae7164ba78c3dd7ac20c487399935b9544bChris Lattner                               '[4] = 12345',
116d51d74a3e89c5e5fc9bfd2814996a5feab6dc932Chris Lattner                               '[5] = 123456',
117d51d74a3e89c5e5fc9bfd2814996a5feab6dc932Chris Lattner                               '[6] = 1234567',
118d51d74a3e89c5e5fc9bfd2814996a5feab6dc932Chris Lattner                               '}'])
119d51d74a3e89c5e5fc9bfd2814996a5feab6dc932Chris Lattner
12033dd2822f3972afe99b61315a890f8bad8ee5d7fChris Lattner        self.expect("p numbers",
12133dd2822f3972afe99b61315a890f8bad8ee5d7fChris Lattner                    substrs = ['$', 'size=7',
12233dd2822f3972afe99b61315a890f8bad8ee5d7fChris Lattner                               '[0] = 1',
123d51d74a3e89c5e5fc9bfd2814996a5feab6dc932Chris Lattner                               '[1] = 12',
124d51d74a3e89c5e5fc9bfd2814996a5feab6dc932Chris Lattner                               '[2] = 123',
1255e9f35c7cb61aea46f56d46c77cbcf47c0cf28baDouglas Gregor                               '[3] = 1234',
1265e9f35c7cb61aea46f56d46c77cbcf47c0cf28baDouglas Gregor                               '[4] = 12345',
1278439fac3ce6c26db7982e34d119bf905b57eac91Douglas Gregor                               '[5] = 123456',
1285e9f35c7cb61aea46f56d46c77cbcf47c0cf28baDouglas Gregor                               '[6] = 1234567',
1295e9f35c7cb61aea46f56d46c77cbcf47c0cf28baDouglas Gregor                               '}'])
1305e9f35c7cb61aea46f56d46c77cbcf47c0cf28baDouglas Gregor
1315f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer        # check access-by-index
1325f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer        self.expect("frame variable numbers[0]",
1330750618b0beacdc9b0a9e210a661e4746823ced7Chris Lattner                    substrs = ['1']);
134121f60c2aa51eae81eac75a9bd8c076140896f3dChris Lattner        self.expect("frame variable numbers[1]",
135121f60c2aa51eae81eac75a9bd8c076140896f3dChris Lattner                    substrs = ['12']);
136121f60c2aa51eae81eac75a9bd8c076140896f3dChris Lattner        self.expect("frame variable numbers[2]",
1375f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer                    substrs = ['123']);
1385f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer        self.expect("frame variable numbers[3]",
139182745ae7892bca0842d9c023370ade5f8d1c6e8Chris Lattner                    substrs = ['1234']);
140182745ae7892bca0842d9c023370ade5f8d1c6e8Chris Lattner
141182745ae7892bca0842d9c023370ade5f8d1c6e8Chris Lattner        # clear out the vector and see that we do the right thing once again
142182745ae7892bca0842d9c023370ade5f8d1c6e8Chris Lattner        self.runCmd("n")
143182745ae7892bca0842d9c023370ade5f8d1c6e8Chris Lattner
144182745ae7892bca0842d9c023370ade5f8d1c6e8Chris Lattner        self.expect("frame variable numbers",
145182745ae7892bca0842d9c023370ade5f8d1c6e8Chris Lattner            substrs = ['numbers = size=0'])
146182745ae7892bca0842d9c023370ade5f8d1c6e8Chris Lattner
147182745ae7892bca0842d9c023370ade5f8d1c6e8Chris Lattner        self.runCmd("n")
148182745ae7892bca0842d9c023370ade5f8d1c6e8Chris Lattner
149182745ae7892bca0842d9c023370ade5f8d1c6e8Chris Lattner        # first value added
1501eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump        self.expect("frame variable numbers",
151182745ae7892bca0842d9c023370ade5f8d1c6e8Chris Lattner                    substrs = ['numbers = size=1',
152182745ae7892bca0842d9c023370ade5f8d1c6e8Chris Lattner                               '[0] = 7',
153182745ae7892bca0842d9c023370ade5f8d1c6e8Chris Lattner                               '}'])
15488eccaf06f9d88191723e71bdf5ca68409393be6Chris Lattner
155182745ae7892bca0842d9c023370ade5f8d1c6e8Chris Lattner        # check if we can display strings
15688eccaf06f9d88191723e71bdf5ca68409393be6Chris Lattner        self.runCmd("c")
157182745ae7892bca0842d9c023370ade5f8d1c6e8Chris Lattner
1581eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump        self.expect("frame variable strings",
159182745ae7892bca0842d9c023370ade5f8d1c6e8Chris Lattner            substrs = ['goofy',
160182745ae7892bca0842d9c023370ade5f8d1c6e8Chris Lattner                       'is',
16188eccaf06f9d88191723e71bdf5ca68409393be6Chris Lattner                       'smart'])
162182745ae7892bca0842d9c023370ade5f8d1c6e8Chris Lattner
16388eccaf06f9d88191723e71bdf5ca68409393be6Chris Lattner        self.expect("p strings",
164182745ae7892bca0842d9c023370ade5f8d1c6e8Chris Lattner                    substrs = ['goofy',
1651eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                               'is',
16632d4d80c26e8c4c1922cff4661e0b9f44a3aabfcDaniel Dunbar                               'smart'])
167a1f23cc7f5dae8b71b8ee631994274609d35eb89Chris Lattner
168182745ae7892bca0842d9c023370ade5f8d1c6e8Chris Lattner        # test summaries based on synthetic children
169182745ae7892bca0842d9c023370ade5f8d1c6e8Chris Lattner        self.runCmd("type summary add std::string_vect string_vect --summary-string \"vector has ${svar%#} items\" -e")
170182745ae7892bca0842d9c023370ade5f8d1c6e8Chris Lattner        self.expect("frame variable strings",
171182745ae7892bca0842d9c023370ade5f8d1c6e8Chris Lattner                    substrs = ['vector has 3 items',
172182745ae7892bca0842d9c023370ade5f8d1c6e8Chris Lattner                               'goofy',
1731eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                               'is',
174182745ae7892bca0842d9c023370ade5f8d1c6e8Chris Lattner                               'smart'])
17588eccaf06f9d88191723e71bdf5ca68409393be6Chris Lattner
176182745ae7892bca0842d9c023370ade5f8d1c6e8Chris Lattner        self.expect("p strings",
177182745ae7892bca0842d9c023370ade5f8d1c6e8Chris Lattner                    substrs = ['vector has 3 items',
178182745ae7892bca0842d9c023370ade5f8d1c6e8Chris Lattner                               'goofy',
179182745ae7892bca0842d9c023370ade5f8d1c6e8Chris Lattner                               'is',
180182745ae7892bca0842d9c023370ade5f8d1c6e8Chris Lattner                               'smart'])
1811eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1821eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump        self.runCmd("n")
1831eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
184182745ae7892bca0842d9c023370ade5f8d1c6e8Chris Lattner        self.expect("frame variable strings",
185182745ae7892bca0842d9c023370ade5f8d1c6e8Chris Lattner                    substrs = ['vector has 4 items'])
186182745ae7892bca0842d9c023370ade5f8d1c6e8Chris Lattner
187182745ae7892bca0842d9c023370ade5f8d1c6e8Chris Lattner        # check access-by-index
188182745ae7892bca0842d9c023370ade5f8d1c6e8Chris Lattner        self.expect("frame variable strings[0]",
189182745ae7892bca0842d9c023370ade5f8d1c6e8Chris Lattner                    substrs = ['goofy']);
1903fdf4b071dc79fae778fb5f376485480756c76a3Chris Lattner        self.expect("frame variable strings[1]",
1913fdf4b071dc79fae778fb5f376485480756c76a3Chris Lattner                    substrs = ['is']);
1923fdf4b071dc79fae778fb5f376485480756c76a3Chris Lattner
193b54d8af9a66cc20a6a9a9219c7eaea8df7ee7fd4Chris Lattner        self.runCmd("n")
194b54d8af9a66cc20a6a9a9219c7eaea8df7ee7fd4Chris Lattner
19592dd386e3f05d176b45a638199d51f536bd9d1c4Chris Lattner        self.expect("frame variable strings",
19692dd386e3f05d176b45a638199d51f536bd9d1c4Chris Lattner            substrs = ['vector has 0 items'])
1973fdf4b071dc79fae778fb5f376485480756c76a3Chris Lattner
19822caddc91d2f6186739c6b20ec58ed38cd68e595Chris Lattnerif __name__ == '__main__':
19922caddc91d2f6186739c6b20ec58ed38cd68e595Chris Lattner    import atexit
20022caddc91d2f6186739c6b20ec58ed38cd68e595Chris Lattner    lldb.SBDebugger.Initialize()
20122caddc91d2f6186739c6b20ec58ed38cd68e595Chris Lattner    atexit.register(lambda: lldb.SBDebugger.Terminate())
202b4398aa27da4d6919c3ae448d1ae66ba6cafc048Ted Kremenek    unittest2.main()
20327ceb9d77d929f02a8a811d189a96885629c7c0cChris Lattner