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