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