Home | History | Annotate | Download | only in foundation
      1 """
      2 Test more expression command sequences with objective-c.
      3 """
      4 
      5 import os, time
      6 import unittest2
      7 import lldb
      8 from lldbtest import *
      9 import lldbutil
     10 
     11 @unittest2.skipUnless(sys.platform.startswith("darwin"), "requires Darwin")
     12 class FoundationTestCase2(TestBase):
     13 
     14     mydir = os.path.join("lang", "objc", "foundation")
     15 
     16     @dsym_test
     17     def test_more_expr_commands_with_dsym(self):
     18         """More expression commands for objective-c."""
     19         self.buildDsym()
     20         self.more_expr_objc()
     21 
     22     @dwarf_test
     23     def test_more_expr_commands_with_dwarf(self):
     24         """More expression commands for objective-c."""
     25         self.buildDwarf()
     26         self.more_expr_objc()
     27 
     28     @dsym_test
     29     def test_NSArray_expr_commands_with_dsym(self):
     30         """Test expression commands for NSArray."""
     31         self.buildDsym()
     32         self.NSArray_expr()
     33 
     34     @dwarf_test
     35     def test_NSArray_expr_commands_with_dwarf(self):
     36         """Test expression commands for NSArray."""
     37         self.buildDwarf()
     38         self.NSArray_expr()
     39 
     40     @dsym_test
     41     def test_NSString_expr_commands_with_dsym(self):
     42         """Test expression commands for NSString."""
     43         self.buildDsym()
     44         self.NSString_expr()
     45 
     46     @dwarf_test
     47     def test_NSString_expr_commands_with_dwarf(self):
     48         """Test expression commands for NSString."""
     49         self.buildDwarf()
     50         self.NSString_expr()
     51 
     52     @dsym_test
     53     def test_MyString_dump_with_dsym(self):
     54         """Test dump of a known Objective-C object by dereferencing it."""
     55         self.buildDsym()
     56         self.MyString_dump()
     57 
     58     @dwarf_test
     59     def test_MyString_dump_with_dwarf(self):
     60         """Test dump of a known Objective-C object by dereferencing it."""
     61         self.buildDwarf()
     62         self.MyString_dump()
     63 
     64     @expectedFailurei386
     65     @dsym_test
     66     def test_NSError_po_with_dsym(self):
     67         """Test that po of the result of an unknown method doesn't require a cast."""
     68         self.buildDsym()
     69         self.NSError_po()
     70 
     71     @expectedFailurei386
     72     @dwarf_test
     73     def test_NSError_po_with_dwarf(self):
     74         """Test that po of the result of an unknown method doesn't require a cast."""
     75         self.buildDsym()
     76         self.NSError_po()
     77         
     78     @dsym_test
     79     def test_NSError_p_with_dsym(self):
     80         """Test that p of the result of an unknown method does require a cast."""
     81         self.buildDsym()
     82         self.NSError_p()
     83 
     84     @dwarf_test
     85     def test_NSError_p_with_dwarf(self):
     86         """Test that p of the result of an unknown method does require a cast."""
     87         self.buildDsym()
     88         self.NSError_p()
     89                 
     90     def setUp(self):
     91         # Call super's setUp().
     92         TestBase.setUp(self)
     93         # Find the line numbers to break at.
     94         self.lines = []
     95         self.lines.append(line_number('main.m', '// Break here for selector: tests'))
     96         self.lines.append(line_number('main.m', '// Break here for NSArray tests'))
     97         self.lines.append(line_number('main.m', '// Break here for NSString tests'))
     98         self.lines.append(line_number('main.m', '// Break here for description test'))
     99         self.lines.append(line_number('main.m', '// Set break point at this line'))
    100     
    101     def more_expr_objc(self):
    102         """More expression commands for objective-c."""
    103         exe = os.path.join(os.getcwd(), "a.out")
    104         self.runCmd("file " + exe, CURRENT_EXECUTABLE_SET)
    105 
    106         # Create a bunch of breakpoints.
    107         for line in self.lines:
    108             lldbutil.run_break_set_by_file_and_line (self, "main.m", line, num_expected_locations=1, loc_exact=True)
    109 
    110         self.runCmd("run", RUN_SUCCEEDED)
    111 
    112         # Test_Selector:
    113         self.runCmd("thread backtrace")
    114         self.expect("expression (char *)sel_getName(sel)",
    115             substrs = ["(char *)",
    116                        "length"])
    117 
    118         self.runCmd("process continue")
    119 
    120         # Test_NSArray:
    121         self.runCmd("thread backtrace")
    122         self.runCmd("process continue")
    123 
    124         # Test_NSString:
    125         self.runCmd("thread backtrace")
    126         self.runCmd("process continue")
    127 
    128         # Test_MyString:
    129         self.runCmd("thread backtrace")
    130         self.expect("expression (char *)sel_getName(_cmd)",
    131             substrs = ["(char *)",
    132                        "description"])
    133 
    134         self.runCmd("process continue")
    135 
    136     @unittest2.expectedFailure(8741897)
    137     def NSArray_expr(self):
    138         """Test expression commands for NSArray."""
    139         exe = os.path.join(os.getcwd(), "a.out")
    140         self.runCmd("file " + exe, CURRENT_EXECUTABLE_SET)
    141 
    142         # Break inside Test_NSArray:
    143         line = self.lines[1]
    144         lldbutil.run_break_set_by_file_and_line (self, "main.m", line, num_expected_locations=1, loc_exact=True)
    145 
    146         self.runCmd("run", RUN_SUCCEEDED)
    147 
    148         # Test_NSArray:
    149         self.runCmd("thread backtrace")
    150         self.expect("expression (int)[nil_mutable_array count]",
    151             patterns = ["\(int\) \$.* = 0"])
    152         self.expect("expression (int)[array1 count]",
    153             patterns = ["\(int\) \$.* = 3"])
    154         self.expect("expression (int)[array2 count]",
    155             patterns = ["\(int\) \$.* = 3"])
    156         self.expect("expression (int)array1.count",
    157             patterns = ["\(int\) \$.* = 3"])
    158         self.expect("expression (int)array2.count",
    159             patterns = ["\(int\) \$.* = 3"])
    160         self.runCmd("process continue")
    161 
    162     @unittest2.expectedFailure(8741897)
    163     def NSString_expr(self):
    164         """Test expression commands for NSString."""
    165         exe = os.path.join(os.getcwd(), "a.out")
    166         self.runCmd("file " + exe, CURRENT_EXECUTABLE_SET)
    167 
    168         # Break inside Test_NSString:
    169         line = self.lines[2]
    170         lldbutil.run_break_set_by_file_and_line (self, "main.m", line, num_expected_locations=1, loc_exact=True)
    171 
    172         self.runCmd("run", RUN_SUCCEEDED)
    173 
    174         # Test_NSString:
    175         self.runCmd("thread backtrace")
    176         self.expect("expression (int)[str length]",
    177             patterns = ["\(int\) \$.* ="])
    178         self.expect("expression (int)[str_id length]",
    179             patterns = ["\(int\) \$.* ="])
    180         self.expect("expression [str description]",
    181             patterns = ["\(id\) \$.* = 0x"])
    182         self.expect("expression [str_id description]",
    183             patterns = ["\(id\) \$.* = 0x"])
    184         self.expect("expression str.description")
    185         self.expect("expression str_id.description")
    186         self.expect('expression str = @"new"')
    187         self.expect('expression str = [NSString stringWithFormat: @"%cew", \'N\']')
    188         self.runCmd("process continue")
    189 
    190     def MyString_dump(self):
    191         """Test dump of a known Objective-C object by dereferencing it."""
    192         exe = os.path.join(os.getcwd(), "a.out")
    193         self.runCmd("file " + exe, CURRENT_EXECUTABLE_SET)
    194         
    195         line = self.lines[4]
    196 
    197         lldbutil.run_break_set_by_file_and_line (self, "main.m", line, num_expected_locations=1, loc_exact=True)
    198 
    199         self.runCmd("run", RUN_SUCCEEDED)
    200         
    201         self.expect("expression --show-types -- *my",
    202             patterns = ["\(MyString\) \$.* = ", "\(MyBase\)", "\(NSObject\)", "\(Class\)"])
    203         self.runCmd("process continue")
    204 
    205     def NSError_po(self):
    206         """Test that po of the result of an unknown method doesn't require a cast."""
    207         exe = os.path.join(os.getcwd(), "a.out")
    208         self.runCmd("file " + exe, CURRENT_EXECUTABLE_SET)
    209         
    210         line = self.lines[4]
    211 
    212         lldbutil.run_break_set_by_file_and_line (self, "main.m", line, num_expected_locations=1, loc_exact=True)
    213 
    214         self.runCmd("run", RUN_SUCCEEDED)
    215 
    216         self.expect("po [NSError errorWithDomain:@\"Hello\" code:35 userInfo:nil]",
    217             substrs = ["Error Domain=Hello", "Code=35", "be completed."])
    218         self.runCmd("process continue")
    219 
    220     def NSError_p(self):
    221         """Test that p of the result of an unknown method does require a cast."""
    222         exe = os.path.join(os.getcwd(), "a.out")
    223         self.runCmd("file " + exe, CURRENT_EXECUTABLE_SET)
    224         
    225         line = self.lines[4]
    226 
    227         lldbutil.run_break_set_by_file_and_line (self, "main.m", line, num_expected_locations=1, loc_exact=True)
    228 
    229         self.runCmd("run", RUN_SUCCEEDED)
    230 
    231         self.expect("p [NSError thisMethodIsntImplemented:0]",
    232                     error = True, 
    233                     patterns = ["no known method", "cast the message send to the method's return type"])
    234         self.runCmd("process continue")
    235 
    236 if __name__ == '__main__':
    237     import atexit
    238     lldb.SBDebugger.Initialize()
    239     atexit.register(lambda: lldb.SBDebugger.Terminate())
    240     unittest2.main()
    241