199451b44SJordan Rupprecht""" 299451b44SJordan RupprechtTest number of threads. 399451b44SJordan Rupprecht""" 499451b44SJordan Rupprecht 599451b44SJordan Rupprecht 699451b44SJordan Rupprecht 799451b44SJordan Rupprechtimport lldb 899451b44SJordan Rupprechtfrom lldbsuite.test.decorators import * 999451b44SJordan Rupprechtfrom lldbsuite.test.lldbtest import * 1099451b44SJordan Rupprechtfrom lldbsuite.test import lldbutil 1199451b44SJordan Rupprecht 1299451b44SJordan Rupprecht 1399451b44SJordan Rupprechtclass MultipleBreakpointTestCase(TestBase): 1499451b44SJordan Rupprecht 1599451b44SJordan Rupprecht def setUp(self): 1699451b44SJordan Rupprecht # Call super's setUp(). 1799451b44SJordan Rupprecht TestBase.setUp(self) 1899451b44SJordan Rupprecht # Find the line number for our breakpoint. 1999451b44SJordan Rupprecht self.breakpoint = line_number('main.cpp', '// Set breakpoint here') 2099451b44SJordan Rupprecht 2199451b44SJordan Rupprecht @expectedFailureAll( 2299451b44SJordan Rupprecht oslist=["linux"], 2399451b44SJordan Rupprecht bugnumber="llvm.org/pr15824 thread states not properly maintained") 2499451b44SJordan Rupprecht @expectedFailureAll( 2599451b44SJordan Rupprecht oslist=lldbplatformutil.getDarwinOSTriples(), 2699451b44SJordan Rupprecht bugnumber="llvm.org/pr15824 thread states not properly maintained and <rdar://problem/28557237>") 2799451b44SJordan Rupprecht @expectedFailureAll( 2899451b44SJordan Rupprecht oslist=["freebsd"], 2999451b44SJordan Rupprecht bugnumber="llvm.org/pr18190 thread states not properly maintained") 3099451b44SJordan Rupprecht @skipIfWindows # This is flakey on Windows: llvm.org/pr24668, llvm.org/pr38373 3199451b44SJordan Rupprecht @expectedFailureNetBSD 3299451b44SJordan Rupprecht def test(self): 3399451b44SJordan Rupprecht """Test simultaneous breakpoints in multiple threads.""" 34*d7dbe2c4SPavel Labath self.build() 3599451b44SJordan Rupprecht exe = self.getBuildArtifact("a.out") 3699451b44SJordan Rupprecht self.runCmd("file " + exe, CURRENT_EXECUTABLE_SET) 3799451b44SJordan Rupprecht 3899451b44SJordan Rupprecht # This should create a breakpoint in the main thread. 3999451b44SJordan Rupprecht lldbutil.run_break_set_by_file_and_line( 4099451b44SJordan Rupprecht self, "main.cpp", self.breakpoint, num_expected_locations=1) 4199451b44SJordan Rupprecht 4299451b44SJordan Rupprecht # Run the program. 4399451b44SJordan Rupprecht self.runCmd("run", RUN_SUCCEEDED) 4499451b44SJordan Rupprecht 4599451b44SJordan Rupprecht # The stop reason of the thread should be breakpoint. 4699451b44SJordan Rupprecht # The breakpoint may be hit in either thread 2 or thread 3. 4799451b44SJordan Rupprecht self.expect("thread list", STOPPED_DUE_TO_BREAKPOINT, 4899451b44SJordan Rupprecht substrs=['stopped', 4999451b44SJordan Rupprecht 'stop reason = breakpoint']) 5099451b44SJordan Rupprecht 5199451b44SJordan Rupprecht # Get the target process 5299451b44SJordan Rupprecht target = self.dbg.GetSelectedTarget() 5399451b44SJordan Rupprecht process = target.GetProcess() 5499451b44SJordan Rupprecht 5599451b44SJordan Rupprecht # Get the number of threads 5699451b44SJordan Rupprecht num_threads = process.GetNumThreads() 5799451b44SJordan Rupprecht 5899451b44SJordan Rupprecht # Make sure we see all three threads 5999451b44SJordan Rupprecht self.assertTrue( 6099451b44SJordan Rupprecht num_threads >= 3, 6199451b44SJordan Rupprecht 'Number of expected threads and actual threads do not match.') 6299451b44SJordan Rupprecht 6399451b44SJordan Rupprecht # Get the thread objects 6499451b44SJordan Rupprecht thread1 = process.GetThreadAtIndex(0) 6599451b44SJordan Rupprecht thread2 = process.GetThreadAtIndex(1) 6699451b44SJordan Rupprecht thread3 = process.GetThreadAtIndex(2) 6799451b44SJordan Rupprecht 6899451b44SJordan Rupprecht # Make sure both threads are stopped 6999451b44SJordan Rupprecht self.assertTrue( 7099451b44SJordan Rupprecht thread1.IsStopped(), 7199451b44SJordan Rupprecht "Primary thread didn't stop during breakpoint") 7299451b44SJordan Rupprecht self.assertTrue( 7399451b44SJordan Rupprecht thread2.IsStopped(), 7499451b44SJordan Rupprecht "Secondary thread didn't stop during breakpoint") 7599451b44SJordan Rupprecht self.assertTrue( 7699451b44SJordan Rupprecht thread3.IsStopped(), 7799451b44SJordan Rupprecht "Tertiary thread didn't stop during breakpoint") 7899451b44SJordan Rupprecht 7999451b44SJordan Rupprecht # Delete the first breakpoint then continue 8099451b44SJordan Rupprecht self.runCmd("breakpoint delete 1") 8199451b44SJordan Rupprecht 8299451b44SJordan Rupprecht # Run to completion 8399451b44SJordan Rupprecht self.runCmd("continue") 8499451b44SJordan Rupprecht 8599451b44SJordan Rupprecht # At this point, the inferior process should have exited. 860ed758b2SDave Lee self.assertEqual( 870ed758b2SDave Lee process.GetState(), lldb.eStateExited, 8899451b44SJordan Rupprecht PROCESS_EXITED) 89