xref: /llvm-project/lldb/test/API/tools/lldb-dap/progress/TestDAP_Progress.py (revision a939a9fd53d98f33b94f9121646d5906a2b9f598)
1*a939a9fdSJacob Lalonde"""
2*a939a9fdSJacob LalondeTest lldb-dap output events
3*a939a9fdSJacob Lalonde"""
4*a939a9fdSJacob Lalonde
5*a939a9fdSJacob Lalondefrom lldbsuite.test.decorators import *
6*a939a9fdSJacob Lalondefrom lldbsuite.test.lldbtest import *
7*a939a9fdSJacob Lalondeimport os
8*a939a9fdSJacob Lalondeimport time
9*a939a9fdSJacob Lalonde
10*a939a9fdSJacob Lalondeimport lldbdap_testcase
11*a939a9fdSJacob Lalonde
12*a939a9fdSJacob Lalonde
13*a939a9fdSJacob Lalondeclass TestDAP_progress(lldbdap_testcase.DAPTestCaseBase):
14*a939a9fdSJacob Lalonde    @skipIfWindows
15*a939a9fdSJacob Lalonde    def test_output(self):
16*a939a9fdSJacob Lalonde        program = self.getBuildArtifact("a.out")
17*a939a9fdSJacob Lalonde        self.build_and_launch(program)
18*a939a9fdSJacob Lalonde        progress_emitter = os.path.join(os.getcwd(), "Progress_emitter.py")
19*a939a9fdSJacob Lalonde        print(f"Progress emitter path: {progress_emitter}")
20*a939a9fdSJacob Lalonde        source = "main.cpp"
21*a939a9fdSJacob Lalonde        # Set breakpoint in the thread function so we can step the threads
22*a939a9fdSJacob Lalonde        breakpoint_ids = self.set_source_breakpoints(
23*a939a9fdSJacob Lalonde            source, [line_number(source, "// break here")]
24*a939a9fdSJacob Lalonde        )
25*a939a9fdSJacob Lalonde        self.continue_to_breakpoints(breakpoint_ids)
26*a939a9fdSJacob Lalonde        self.dap_server.request_evaluate(
27*a939a9fdSJacob Lalonde            f"`command script import {progress_emitter}", context="repl"
28*a939a9fdSJacob Lalonde        )
29*a939a9fdSJacob Lalonde        self.dap_server.request_evaluate(
30*a939a9fdSJacob Lalonde            "`test-progress --total 3 --seconds 1", context="repl"
31*a939a9fdSJacob Lalonde        )
32*a939a9fdSJacob Lalonde
33*a939a9fdSJacob Lalonde        self.dap_server.wait_for_event("progressEnd", 15)
34*a939a9fdSJacob Lalonde        # Expect at least a start, an update, and end event
35*a939a9fdSJacob Lalonde        # However because the underlying Progress instance is an RAII object and we can't guaruntee
36*a939a9fdSJacob Lalonde        # it's deterministic destruction in the python API, we verify just start and update
37*a939a9fdSJacob Lalonde        # otherwise this test could be flakey.
38*a939a9fdSJacob Lalonde        self.assertTrue(len(self.dap_server.progress_events) > 0)
39*a939a9fdSJacob Lalonde        start_found = False
40*a939a9fdSJacob Lalonde        update_found = False
41*a939a9fdSJacob Lalonde        for event in self.dap_server.progress_events:
42*a939a9fdSJacob Lalonde            event_type = event["event"]
43*a939a9fdSJacob Lalonde            if "progressStart" in event_type:
44*a939a9fdSJacob Lalonde                start_found = True
45*a939a9fdSJacob Lalonde            if "progressUpdate" in event_type:
46*a939a9fdSJacob Lalonde                update_found = True
47*a939a9fdSJacob Lalonde
48*a939a9fdSJacob Lalonde        self.assertTrue(start_found)
49*a939a9fdSJacob Lalonde        self.assertTrue(update_found)
50