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