199451b44SJordan Rupprecht""" 299451b44SJordan RupprechtTests basic Main Thread Checker support (detecting a main-thread-only violation). 399451b44SJordan Rupprecht""" 499451b44SJordan Rupprecht 599451b44SJordan Rupprechtimport lldb 699451b44SJordan Rupprechtfrom lldbsuite.test.lldbtest import * 799451b44SJordan Rupprechtfrom lldbsuite.test.decorators import * 899451b44SJordan Rupprechtimport lldbsuite.test.lldbutil as lldbutil 999451b44SJordan Rupprechtfrom lldbsuite.test.lldbplatformutil import * 1099451b44SJordan Rupprechtimport json 1199451b44SJordan Rupprecht 1299451b44SJordan Rupprecht 1399451b44SJordan Rupprechtclass MTCSimpleTestCase(TestBase): 1499451b44SJordan Rupprecht @skipUnlessDarwin 15*2238dcc3SJonas Devlieghere @skipIf(compiler="clang", compiler_version=["<", "9.0"]) 1699451b44SJordan Rupprecht def test(self): 1799451b44SJordan Rupprecht self.mtc_dylib_path = findMainThreadCheckerDylib() 1899451b44SJordan Rupprecht if self.mtc_dylib_path == "": 1999451b44SJordan Rupprecht self.skipTest("This test requires libMainThreadChecker.dylib") 2099451b44SJordan Rupprecht 2199451b44SJordan Rupprecht self.build() 2299451b44SJordan Rupprecht self.mtc_tests() 2399451b44SJordan Rupprecht 24*2238dcc3SJonas Devlieghere @skipIf(archs=["i386"]) 25*2238dcc3SJonas Devlieghere @skipIf(compiler="clang", compiler_version=["<", "9.0"]) 2699451b44SJordan Rupprecht def mtc_tests(self): 27b3a0c4d7SRaphael Isemann self.assertNotEqual(self.mtc_dylib_path, "") 2899451b44SJordan Rupprecht 2999451b44SJordan Rupprecht # Load the test 3099451b44SJordan Rupprecht exe = self.getBuildArtifact("a.out") 3199451b44SJordan Rupprecht self.expect("file " + exe, patterns=["Current executable set to .*a.out"]) 3299451b44SJordan Rupprecht 3399451b44SJordan Rupprecht self.runCmd("env DYLD_INSERT_LIBRARIES=%s" % self.mtc_dylib_path) 3499451b44SJordan Rupprecht self.runCmd("run") 3599451b44SJordan Rupprecht 3699451b44SJordan Rupprecht process = self.dbg.GetSelectedTarget().process 3799451b44SJordan Rupprecht thread = process.GetSelectedThread() 3899451b44SJordan Rupprecht frame = thread.GetSelectedFrame() 3999451b44SJordan Rupprecht 4099451b44SJordan Rupprecht view = "NSView" if lldbplatformutil.getPlatform() == "macosx" else "UIView" 4199451b44SJordan Rupprecht 42*2238dcc3SJonas Devlieghere self.expect( 43*2238dcc3SJonas Devlieghere "thread info", 44*2238dcc3SJonas Devlieghere substrs=[ 45*2238dcc3SJonas Devlieghere "stop reason = -[" 46*2238dcc3SJonas Devlieghere + view 47*2238dcc3SJonas Devlieghere + " superview] must be used from main thread only" 48*2238dcc3SJonas Devlieghere ], 49*2238dcc3SJonas Devlieghere ) 5099451b44SJordan Rupprecht 5199451b44SJordan Rupprecht self.expect( 5299451b44SJordan Rupprecht "thread info -s", 5399451b44SJordan Rupprecht substrs=[ 5499451b44SJordan Rupprecht "api_name", 5599451b44SJordan Rupprecht "class_name", 5699451b44SJordan Rupprecht "description", 5799451b44SJordan Rupprecht "instrumentation_class", 58*2238dcc3SJonas Devlieghere "selector", 59*2238dcc3SJonas Devlieghere ], 60*2238dcc3SJonas Devlieghere ) 610f821339SJonas Devlieghere self.assertStopReason(thread.GetStopReason(), lldb.eStopReasonInstrumentation) 62*2238dcc3SJonas Devlieghere output_lines = self.res.GetOutput().split("\n") 63*2238dcc3SJonas Devlieghere json_line = "\n".join(output_lines[2:]) 6499451b44SJordan Rupprecht data = json.loads(json_line) 6599451b44SJordan Rupprecht self.assertEqual(data["instrumentation_class"], "MainThreadChecker") 6699451b44SJordan Rupprecht self.assertEqual(data["api_name"], "-[" + view + " superview]") 6799451b44SJordan Rupprecht self.assertEqual(data["class_name"], view) 6899451b44SJordan Rupprecht self.assertEqual(data["selector"], "superview") 69*2238dcc3SJonas Devlieghere self.assertEqual( 70*2238dcc3SJonas Devlieghere data["description"], 71*2238dcc3SJonas Devlieghere "-[" + view + " superview] must be used from main thread only", 72*2238dcc3SJonas Devlieghere ) 73