199451b44SJordan Rupprecht""" 299451b44SJordan RupprechtUse lldb Python API to make sure the dynamic checkers are doing their jobs. 399451b44SJordan Rupprecht""" 499451b44SJordan Rupprecht 599451b44SJordan Rupprecht 699451b44SJordan Rupprechtimport lldb 799451b44SJordan Rupprechtfrom lldbsuite.test.decorators import * 899451b44SJordan Rupprechtfrom lldbsuite.test.lldbtest import * 999451b44SJordan Rupprechtfrom lldbsuite.test import lldbutil 1099451b44SJordan Rupprecht 1199451b44SJordan Rupprecht 1299451b44SJordan Rupprechtclass ObjCCheckerTestCase(TestBase): 1399451b44SJordan Rupprecht NO_DEBUG_INFO_TESTCASE = True 1499451b44SJordan Rupprecht 1599451b44SJordan Rupprecht def setUp(self): 1699451b44SJordan Rupprecht # Call super's setUp(). 1799451b44SJordan Rupprecht TestBase.setUp(self) 1899451b44SJordan Rupprecht 1999451b44SJordan Rupprecht # Find the line number to break for main.c. 20*2238dcc3SJonas Devlieghere self.source_name = "main.m" 2199451b44SJordan Rupprecht 22*2238dcc3SJonas Devlieghere @add_test_categories(["pyapi"]) 2399451b44SJordan Rupprecht def test_objc_checker(self): 2499451b44SJordan Rupprecht """Test that checkers catch unrecognized selectors""" 25*2238dcc3SJonas Devlieghere if self.getArchitecture() == "i386": 2699451b44SJordan Rupprecht self.skipTest("requires Objective-C 2.0 runtime") 2799451b44SJordan Rupprecht 2899451b44SJordan Rupprecht self.build() 2999451b44SJordan Rupprecht exe = self.getBuildArtifact("a.out") 3099451b44SJordan Rupprecht 3199451b44SJordan Rupprecht # Create a target from the debugger. 3299451b44SJordan Rupprecht 3399451b44SJordan Rupprecht target = self.dbg.CreateTarget(exe) 3499451b44SJordan Rupprecht self.assertTrue(target, VALID_TARGET) 3599451b44SJordan Rupprecht 3699451b44SJordan Rupprecht # Set up our breakpoints: 3799451b44SJordan Rupprecht 3899451b44SJordan Rupprecht main_bkpt = target.BreakpointCreateBySourceRegex( 39*2238dcc3SJonas Devlieghere "Set a breakpoint here.", lldb.SBFileSpec(self.source_name) 40*2238dcc3SJonas Devlieghere ) 41*2238dcc3SJonas Devlieghere self.assertTrue( 42*2238dcc3SJonas Devlieghere main_bkpt and main_bkpt.GetNumLocations() == 1, VALID_BREAKPOINT 43*2238dcc3SJonas Devlieghere ) 4499451b44SJordan Rupprecht 4599451b44SJordan Rupprecht # Now launch the process, and do not stop at the entry point. 46*2238dcc3SJonas Devlieghere process = target.LaunchSimple(None, None, self.get_process_working_directory()) 4799451b44SJordan Rupprecht 48*2238dcc3SJonas Devlieghere self.assertState(process.GetState(), lldb.eStateStopped, PROCESS_STOPPED) 4999451b44SJordan Rupprecht 50*2238dcc3SJonas Devlieghere threads = lldbutil.get_threads_stopped_at_breakpoint(process, main_bkpt) 51619e2e09SDave Lee self.assertEqual(len(threads), 1) 5299451b44SJordan Rupprecht thread = threads[0] 5399451b44SJordan Rupprecht 5499451b44SJordan Rupprecht # 5599451b44SJordan Rupprecht # The class Simple doesn't have a count method. Make sure that we don't 5699451b44SJordan Rupprecht # actually try to send count but catch it as an unrecognized selector. 5799451b44SJordan Rupprecht 5899451b44SJordan Rupprecht frame = thread.GetFrameAtIndex(0) 5999451b44SJordan Rupprecht expr_value = frame.EvaluateExpression("(int) [my_simple count]", False) 6099451b44SJordan Rupprecht expr_error = expr_value.GetError() 6199451b44SJordan Rupprecht 6299451b44SJordan Rupprecht self.assertTrue(expr_error.Fail()) 6399451b44SJordan Rupprecht 6499451b44SJordan Rupprecht # Make sure the call produced no NSLog stdout. 6599451b44SJordan Rupprecht stdout = process.GetSTDOUT(100) 6699451b44SJordan Rupprecht self.assertTrue(stdout is None or (len(stdout) == 0)) 6799451b44SJordan Rupprecht 6899451b44SJordan Rupprecht # Make sure the error is helpful: 6999451b44SJordan Rupprecht err_string = expr_error.GetCString() 703cc37622SDave Lee self.assertIn("selector", err_string) 7199451b44SJordan Rupprecht 7299451b44SJordan Rupprecht # 7399451b44SJordan Rupprecht # Check that we correctly insert the checker for an 7499451b44SJordan Rupprecht # ObjC method with the struct return convention. 7599451b44SJordan Rupprecht # Getting this wrong would cause us to call the checker 7699451b44SJordan Rupprecht # with the wrong arguments, and the checker would crash 7799451b44SJordan Rupprecht # So I'm just checking "expression runs successfully" here: 7899451b44SJordan Rupprecht # 7999451b44SJordan Rupprecht expr_value = frame.EvaluateExpression("[my_simple getBigStruct]", False) 8099451b44SJordan Rupprecht expr_error = expr_value.GetError() 8199451b44SJordan Rupprecht 82779bbbf2SDave Lee self.assertSuccess(expr_error) 83