diff options
Diffstat (limited to 'packages/Python/lldbsuite/test/lang/objc/foundation/TestObjCMethods.py')
| -rw-r--r-- | packages/Python/lldbsuite/test/lang/objc/foundation/TestObjCMethods.py | 188 | 
1 files changed, 126 insertions, 62 deletions
| diff --git a/packages/Python/lldbsuite/test/lang/objc/foundation/TestObjCMethods.py b/packages/Python/lldbsuite/test/lang/objc/foundation/TestObjCMethods.py index 2a8e80f6d76e..d636458ce1aa 100644 --- a/packages/Python/lldbsuite/test/lang/objc/foundation/TestObjCMethods.py +++ b/packages/Python/lldbsuite/test/lang/objc/foundation/TestObjCMethods.py @@ -6,8 +6,9 @@ Also lookup objective-c data types and evaluate expressions.  from __future__ import print_function - -import os, os.path, time +import os +import os.path +import time  import lldb  import string  from lldbsuite.test.decorators import * @@ -15,6 +16,8 @@ from lldbsuite.test.lldbtest import *  from lldbsuite.test import lldbutil  file_index = 0 + +  @skipUnlessDarwin  class FoundationTestCase(TestBase): @@ -25,7 +28,9 @@ class FoundationTestCase(TestBase):          TestBase.setUp(self)          # Find the line number to break inside main().          self.main_source = "main.m" -        self.line = line_number(self.main_source, '// Set break point at this line.') +        self.line = line_number( +            self.main_source, +            '// Set break point at this line.')      def test_break(self):          """Test setting objc breakpoints using '_regexp-break' and 'breakpoint set'.""" @@ -34,54 +39,78 @@ class FoundationTestCase(TestBase):          self.runCmd("file " + exe, CURRENT_EXECUTABLE_SET)          # Stop at +[NSString stringWithFormat:]. -        break_results = lldbutil.run_break_set_command(self, "_regexp-break +[NSString stringWithFormat:]") -        lldbutil.check_breakpoint_result (self, break_results, symbol_name='+[NSString stringWithFormat:]', num_locations=1) +        break_results = lldbutil.run_break_set_command( +            self, "_regexp-break +[NSString stringWithFormat:]") +        lldbutil.check_breakpoint_result( +            self, +            break_results, +            symbol_name='+[NSString stringWithFormat:]', +            num_locations=1)          # Stop at -[MyString initWithNSString:]. -        lldbutil.run_break_set_by_symbol (self, '-[MyString initWithNSString:]', num_expected_locations=1, sym_exact=True) +        lldbutil.run_break_set_by_symbol( +            self, +            '-[MyString initWithNSString:]', +            num_expected_locations=1, +            sym_exact=True)          # Stop at the "description" selector. -        lldbutil.run_break_set_by_selector (self, 'description', num_expected_locations=1, module_name='a.out') +        lldbutil.run_break_set_by_selector( +            self, +            'description', +            num_expected_locations=1, +            module_name='a.out')          # Stop at -[NSAutoreleasePool release]. -        break_results = lldbutil.run_break_set_command(self, "_regexp-break -[NSAutoreleasePool release]") -        lldbutil.check_breakpoint_result (self, break_results, symbol_name='-[NSAutoreleasePool release]', num_locations=1) +        break_results = lldbutil.run_break_set_command( +            self, "_regexp-break -[NSAutoreleasePool release]") +        lldbutil.check_breakpoint_result( +            self, +            break_results, +            symbol_name='-[NSAutoreleasePool release]', +            num_locations=1)          self.runCmd("run", RUN_SUCCEEDED)          # First stop is +[NSString stringWithFormat:]. -        self.expect("thread backtrace", "Stop at +[NSString stringWithFormat:]", -            substrs = ["Foundation`+[NSString stringWithFormat:]"]) +        self.expect( +            "thread backtrace", +            "Stop at +[NSString stringWithFormat:]", +            substrs=["Foundation`+[NSString stringWithFormat:]"])          self.runCmd("process continue")          # Second stop is still +[NSString stringWithFormat:]. -        self.expect("thread backtrace", "Stop at +[NSString stringWithFormat:]", -            substrs = ["Foundation`+[NSString stringWithFormat:]"]) +        self.expect( +            "thread backtrace", +            "Stop at +[NSString stringWithFormat:]", +            substrs=["Foundation`+[NSString stringWithFormat:]"])          self.runCmd("process continue")          # Followed by a.out`-[MyString initWithNSString:]. -        self.expect("thread backtrace", "Stop at a.out`-[MyString initWithNSString:]", -            substrs = ["a.out`-[MyString initWithNSString:]"]) +        self.expect( +            "thread backtrace", +            "Stop at a.out`-[MyString initWithNSString:]", +            substrs=["a.out`-[MyString initWithNSString:]"])          self.runCmd("process continue")          # Followed by -[MyString description].          self.expect("thread backtrace", "Stop at -[MyString description]", -            substrs = ["a.out`-[MyString description]"]) +                    substrs=["a.out`-[MyString description]"])          self.runCmd("process continue")          # Followed by the same -[MyString description].          self.expect("thread backtrace", "Stop at -[MyString description]", -            substrs = ["a.out`-[MyString description]"]) +                    substrs=["a.out`-[MyString description]"])          self.runCmd("process continue")          # Followed by -[NSAutoreleasePool release].          self.expect("thread backtrace", "Stop at -[NSAutoreleasePool release]", -            substrs = ["Foundation`-[NSAutoreleasePool release]"]) +                    substrs=["Foundation`-[NSAutoreleasePool release]"])      # rdar://problem/8542091      # rdar://problem/8492646 @@ -92,32 +121,40 @@ class FoundationTestCase(TestBase):          self.runCmd("file " + exe, CURRENT_EXECUTABLE_SET)          # Stop at -[MyString description]. -        lldbutil.run_break_set_by_symbol (self, '-[MyString description]', num_expected_locations=1, sym_exact=True) +        lldbutil.run_break_set_by_symbol( +            self, +            '-[MyString description]', +            num_expected_locations=1, +            sym_exact=True)  #        self.expect("breakpoint set -n '-[MyString description]", BREAKPOINT_CREATED, -#            startstr = "Breakpoint created: 1: name = '-[MyString description]', locations = 1") +# startstr = "Breakpoint created: 1: name = '-[MyString description]', +# locations = 1")          self.runCmd("run", RUN_SUCCEEDED)          # The backtrace should show we stop at -[MyString description].          self.expect("thread backtrace", "Stop at -[MyString description]", -            substrs = ["a.out`-[MyString description]"]) +                    substrs=["a.out`-[MyString description]"])          # Lookup objc data type MyString and evaluate some expressions.          self.expect("image lookup -t NSString", DATA_TYPES_DISPLAYED_CORRECTLY, -            substrs = ['name = "NSString"', -                       'compiler_type = "@interface NSString']) +                    substrs=['name = "NSString"', +                             'compiler_type = "@interface NSString'])          self.expect("image lookup -t MyString", DATA_TYPES_DISPLAYED_CORRECTLY, -            substrs = ['name = "MyString"', -                       'compiler_type = "@interface MyString', -                       'NSString * str;', -                       'NSDate * date;']) - -        self.expect("frame variable --show-types --scope", VARIABLES_DISPLAYED_CORRECTLY, -            substrs = ["ARG: (MyString *) self"], -            patterns = ["ARG: \(.*\) _cmd", -                        "(objc_selector *)|(SEL)"]) +                    substrs=['name = "MyString"', +                             'compiler_type = "@interface MyString', +                             'NSString * str;', +                             'NSDate * date;']) + +        self.expect( +            "frame variable --show-types --scope", +            VARIABLES_DISPLAYED_CORRECTLY, +            substrs=["ARG: (MyString *) self"], +            patterns=[ +                "ARG: \(.*\) _cmd", +                "(objc_selector *)|(SEL)"])          # rdar://problem/8651752          # don't crash trying to ask clang how many children an empty record has @@ -126,28 +163,37 @@ class FoundationTestCase(TestBase):          # rdar://problem/8492646          # test/foundation fails after updating to tot r115023          # self->str displays nothing as output -        self.expect("frame variable --show-types self->str", VARIABLES_DISPLAYED_CORRECTLY, -            startstr = "(NSString *) self->str") +        self.expect( +            "frame variable --show-types self->str", +            VARIABLES_DISPLAYED_CORRECTLY, +            startstr="(NSString *) self->str")          # rdar://problem/8447030          # 'frame variable self->date' displays the wrong data member -        self.expect("frame variable --show-types self->date", VARIABLES_DISPLAYED_CORRECTLY, -            startstr = "(NSDate *) self->date") +        self.expect( +            "frame variable --show-types self->date", +            VARIABLES_DISPLAYED_CORRECTLY, +            startstr="(NSDate *) self->date")          # This should display the str and date member fields as well. -        self.expect("frame variable --show-types *self", VARIABLES_DISPLAYED_CORRECTLY, -            substrs = ["(MyString) *self", -                       "(NSString *) str", -                       "(NSDate *) date"]) -         +        self.expect( +            "frame variable --show-types *self", +            VARIABLES_DISPLAYED_CORRECTLY, +            substrs=[ +                "(MyString) *self", +                "(NSString *) str", +                "(NSDate *) date"]) +          # isa should be accessible.          self.expect("expression self->isa", VARIABLES_DISPLAYED_CORRECTLY, -            substrs = ["(Class)"]) +                    substrs=["(Class)"])          # This should fail expectedly. -        self.expect("expression self->non_existent_member", -                    COMMAND_FAILED_AS_EXPECTED, error=True, -            startstr = "error: 'MyString' does not have a member named 'non_existent_member'") +        self.expect( +            "expression self->non_existent_member", +            COMMAND_FAILED_AS_EXPECTED, +            error=True, +            startstr="error: 'MyString' does not have a member named 'non_existent_member'")          # Use expression parser.          self.runCmd("expression self->str") @@ -163,7 +209,8 @@ class FoundationTestCase(TestBase):          #          self.runCmd("breakpoint delete 1") -        lldbutil.run_break_set_by_file_and_line (self, "main.m", self.line, num_expected_locations=1, loc_exact=True) +        lldbutil.run_break_set_by_file_and_line( +            self, "main.m", self.line, num_expected_locations=1, loc_exact=True)          self.runCmd("process continue") @@ -171,12 +218,15 @@ class FoundationTestCase(TestBase):          # test/foundation: expr -o -- my not working?          #          # Test new feature with r115115: -        # Add "-o" option to "expression" which prints the object description if available. -        self.expect("expression --object-description -- my", "Object description displayed correctly", -            patterns = ["Hello from.*a.out.*with timestamp: "]) +        # Add "-o" option to "expression" which prints the object description +        # if available. +        self.expect( +            "expression --object-description -- my", +            "Object description displayed correctly", +            patterns=["Hello from.*a.out.*with timestamp: "])      @add_test_categories(['pyapi']) -    def test_print_ivars_correctly (self): +    def test_print_ivars_correctly(self):          self.build()          # See: <rdar://problem/8717050> lldb needs to use the ObjC runtime symbols for ivar offsets          # Only fails for the ObjC 2.0 runtime. @@ -189,7 +239,8 @@ class FoundationTestCase(TestBase):          self.assertTrue(break1, VALID_BREAKPOINT)          # Now launch the process, and do not stop at entry point. -        process = target.LaunchSimple (None, None, self.get_process_working_directory()) +        process = target.LaunchSimple( +            None, None, self.get_process_working_directory())          self.assertTrue(process, PROCESS_IS_VALID) @@ -205,7 +256,7 @@ class FoundationTestCase(TestBase):          cur_frame = thread.GetFrameAtIndex(0)          line_number = cur_frame.GetLineEntry().GetLine() -        self.assertTrue (line_number == self.line, "Hit the first breakpoint.") +        self.assertTrue(line_number == self.line, "Hit the first breakpoint.")          my_var = cur_frame.FindVariable("my")          self.assertTrue(my_var, "Made a variable object for my") @@ -222,7 +273,9 @@ class FoundationTestCase(TestBase):          my_str_value = int(my_str_var.GetValue(), 0) -        self.assertTrue(str_value == my_str_value, "Got the correct value for my->str") +        self.assertTrue( +            str_value == my_str_value, +            "Got the correct value for my->str")      def test_expression_lookups_objc(self):          """Test running an expression detect spurious debug info lookups (DWARF).""" @@ -231,32 +284,43 @@ class FoundationTestCase(TestBase):          self.runCmd("file " + exe, CURRENT_EXECUTABLE_SET)          # Stop at -[MyString initWithNSString:]. -        lldbutil.run_break_set_by_symbol (self, '-[MyString initWithNSString:]', num_expected_locations=1, sym_exact=True) +        lldbutil.run_break_set_by_symbol( +            self, +            '-[MyString initWithNSString:]', +            num_expected_locations=1, +            sym_exact=True)          self.runCmd("run", RUN_SUCCEEDED)          global file_index          # Log any DWARF lookups          ++file_index -        logfile = os.path.join(os.getcwd(), "dwarf-lookups-" + self.getArchitecture() + "-" + str(file_index) + ".txt") +        logfile = os.path.join( +            os.getcwd(), +            "dwarf-lookups-" + +            self.getArchitecture() + +            "-" + +            str(file_index) + +            ".txt")          self.runCmd("log enable -f %s dwarf lookups" % (logfile))          self.runCmd("expr self")          self.runCmd("log disable dwarf lookups") -         +          def cleanup(): -            if os.path.exists (logfile): -                os.unlink (logfile) -         +            if os.path.exists(logfile): +                os.unlink(logfile) +          self.addTearDownHook(cleanup) -         -        if os.path.exists (logfile): + +        if os.path.exists(logfile):              f = open(logfile)              lines = f.readlines()              num_errors = 0              for line in lines:                  if string.find(line, "$__lldb") != -1:                      if num_errors == 0: -                        print("error: found spurious name lookups when evaluating an expression:") +                        print( +                            "error: found spurious name lookups when evaluating an expression:")                      num_errors += 1                      print(line, end='')              self.assertTrue(num_errors == 0, "Spurious lookups detected") | 
