Home | History | Annotate | Download | only in hidden-ivars
      1 """Test that hidden ivars in a shared library are visible from the main executable."""
      2 
      3 import os, time
      4 import unittest2
      5 import lldb
      6 from lldbtest import *
      7 import lldbutil
      8 
      9 class HiddenIvarsTestCase(TestBase):
     10 
     11     mydir = os.path.join("lang", "objc", "hidden-ivars")
     12 
     13     @unittest2.skipUnless(sys.platform.startswith("darwin"), "requires Darwin")
     14     @dsym_test
     15     def test_expr_with_dsym(self):
     16         if self.getArchitecture() == 'i386':
     17             self.skipTest("requires modern objc runtime")
     18         self.buildDsym()
     19         self.expr()
     20 
     21     @unittest2.skipUnless(sys.platform.startswith("darwin"), "requires Darwin")
     22     @dwarf_test
     23     def test_expr_with_dwarf(self):
     24         if self.getArchitecture() == 'i386':
     25             self.skipTest("requires modern objc runtime")
     26         self.buildDwarf()
     27         self.expr()
     28 
     29     @unittest2.expectedFailure
     30     @unittest2.skipUnless(sys.platform.startswith("darwin"), "requires Darwin")
     31     @dsym_test
     32     def test_frame_variable_with_dsym(self):
     33         if self.getArchitecture() == 'i386':
     34             self.skipTest("requires modern objc runtime")
     35         self.buildDsym()
     36         self.frame_var()
     37 
     38     @unittest2.expectedFailure
     39     @unittest2.skipUnless(sys.platform.startswith("darwin"), "requires Darwin")
     40     @dwarf_test
     41     def test_frame_variable_with_dwarf(self):
     42         if self.getArchitecture() == 'i386':
     43             self.skipTest("requires modern objc runtime")
     44         self.buildDwarf()
     45         self.frame_var()
     46 
     47     def setUp(self):
     48         # Call super's setUp().
     49         TestBase.setUp(self)
     50         # Find the line number to break inside main().
     51         self.line = line_number('main.m', '// Set breakpoint 0 here.')
     52 
     53     def common_setup(self):
     54         exe = os.path.join(os.getcwd(), "a.out")
     55         self.runCmd("file " + exe, CURRENT_EXECUTABLE_SET)
     56 
     57         # Break inside the foo function which takes a bar_ptr argument.
     58         lldbutil.run_break_set_by_file_and_line (self, "main.m", self.line, num_expected_locations=1, loc_exact=True)
     59 
     60         self.runCmd("run", RUN_SUCCEEDED)
     61 
     62         # The stop reason of the thread should be breakpoint.
     63         self.expect("thread list", STOPPED_DUE_TO_BREAKPOINT,
     64             substrs = ['stopped',
     65                        'stop reason = breakpoint'])
     66 
     67         # The breakpoint should have a hit count of 1.
     68         self.expect("breakpoint list -f", BREAKPOINT_HIT_ONCE,
     69             substrs = [' resolved, hit count = 1'])
     70 
     71     def expr(self):
     72         self.common_setup()
     73 
     74         # This should display correctly.
     75         self.expect("expression (j->_definer->foo)", VARIABLES_DISPLAYED_CORRECTLY,
     76             substrs = ["= 4"])
     77 
     78         self.expect("expression (j->_definer->bar)", VARIABLES_DISPLAYED_CORRECTLY,
     79             substrs = ["= 5"])
     80             
     81         self.expect("expression *(j->_definer)", VARIABLES_DISPLAYED_CORRECTLY,
     82             substrs = ["foo = 4", "bar = 5"])
     83 
     84         self.expect("expression (k->foo)", VARIABLES_DISPLAYED_CORRECTLY,
     85             substrs = ["= 2"])
     86 
     87         self.expect("expression (k->bar)", VARIABLES_DISPLAYED_CORRECTLY,
     88             substrs = ["= 3"])
     89 
     90         self.expect("expression *(k)", VARIABLES_DISPLAYED_CORRECTLY,
     91             substrs = ["foo = 2", "bar = 3"])
     92 
     93     def frame_var(self):
     94         self.common_setup()
     95 
     96         # This should display correctly.
     97         self.expect("frame variable j->_definer->foo", VARIABLES_DISPLAYED_CORRECTLY,
     98             substrs = ["= 4"])
     99 
    100         self.expect("frame variable j->_definer->bar", VARIABLES_DISPLAYED_CORRECTLY,
    101             substrs = ["= 5"])
    102             
    103         self.expect("frame variable *j->_definer", VARIABLES_DISPLAYED_CORRECTLY,
    104             substrs = ["foo = 4", "bar = 5"])
    105 
    106         self.expect("frame variable k->foo", VARIABLES_DISPLAYED_CORRECTLY,
    107             substrs = ["= 2"])
    108 
    109         self.expect("frame variable k->bar", VARIABLES_DISPLAYED_CORRECTLY,
    110             substrs = ["= 3"])
    111 
    112         self.expect("frame variable *k", VARIABLES_DISPLAYED_CORRECTLY,
    113             substrs = ["foo = 2", "bar = 3"])
    114                        
    115 if __name__ == '__main__':
    116     import atexit
    117     lldb.SBDebugger.Initialize()
    118     atexit.register(lambda: lldb.SBDebugger.Terminate())
    119     unittest2.main()
    120