xref: /llvm-project/lldb/test/API/commands/gui/spawn-threads/TestGuiSpawnThreads.py (revision 6bf923d5c3daf5d66e0acf53d037a12ceff4a275)
183695d45SPavel Kosov"""
283695d45SPavel KosovTest that 'gui' does not crash when adding new threads, which
383695d45SPavel Kosovpopulate TreeItem's children and may be reallocated elsewhere.
483695d45SPavel Kosov"""
583695d45SPavel Kosov
683695d45SPavel Kosovimport lldb
783695d45SPavel Kosovfrom lldbsuite.test.decorators import *
883695d45SPavel Kosovfrom lldbsuite.test.lldbtest import *
983695d45SPavel Kosovfrom lldbsuite.test.lldbpexpect import PExpectTest
1083695d45SPavel Kosov
1183695d45SPavel Kosovimport sys
1283695d45SPavel Kosov
13*6bf923d5SDavid Spickett
1483695d45SPavel Kosovclass TestGuiSpawnThreadsTest(PExpectTest):
1583695d45SPavel Kosov    # PExpect uses many timeouts internally and doesn't play well
1683695d45SPavel Kosov    # under ASAN on a loaded machine..
1783695d45SPavel Kosov    @skipIfAsan
1883695d45SPavel Kosov    @skipIfCursesSupportMissing
1983695d45SPavel Kosov    def test_gui(self):
2083695d45SPavel Kosov        self.build()
2183695d45SPavel Kosov
22*6bf923d5SDavid Spickett        self.launch(executable=self.getBuildArtifact("a.out"), dimensions=(100, 500))
2383695d45SPavel Kosov        self.expect(
24*6bf923d5SDavid Spickett            'breakpoint set -f main.cpp -p "break here"',
25*6bf923d5SDavid Spickett            substrs=["Breakpoint 1", "address ="],
2683695d45SPavel Kosov        )
2783695d45SPavel Kosov        self.expect(
28*6bf923d5SDavid Spickett            'breakpoint set -f main.cpp -p "before join"',
29*6bf923d5SDavid Spickett            substrs=["Breakpoint 2", "address ="],
3083695d45SPavel Kosov        )
3183695d45SPavel Kosov        self.expect("run", substrs=["stop reason ="])
3283695d45SPavel Kosov
3383695d45SPavel Kosov        escape_key = chr(27).encode()
3483695d45SPavel Kosov
3583695d45SPavel Kosov        # Start the GUI
3683695d45SPavel Kosov        self.child.sendline("gui")
3783695d45SPavel Kosov        self.child.expect_exact("Threads")
3883695d45SPavel Kosov        self.child.expect_exact(f"thread #1: tid =")
3983695d45SPavel Kosov
4083695d45SPavel Kosov        for i in range(5):
4183695d45SPavel Kosov            # Stopped at the breakpoint, continue over the thread creation
4283695d45SPavel Kosov            self.child.send("c")
4383695d45SPavel Kosov            # Check the newly created thread
4483695d45SPavel Kosov            self.child.expect_exact(f"thread #{i + 2}: tid =")
4583695d45SPavel Kosov
4683695d45SPavel Kosov        # Exit GUI.
4783695d45SPavel Kosov        self.child.send(escape_key)
4883695d45SPavel Kosov        self.expect_prompt()
4983695d45SPavel Kosov
5083695d45SPavel Kosov        self.quit()
51