While trying to make progress on #133782, I noticed that TestDAP_Progress was taking 90 seconds to complete. This patch brings that down to 10 seocnds by making the following changes: 1. Don't call `wait_for_event` with a 15 second timeout. By the time we call this, all progress events have been emitted, which means that we're just sitting there until we hit the timeout. 2. Don't use 10 steps (= 10 seconds) for indeterminate progress. We have two indeterminate progress tests so that's 6 seconds instead of 20. 3. Don't launch the process over and over. Once we have a dap session, we can clear the progress vector and emit new progress events.
112 lines
3.4 KiB
Python
112 lines
3.4 KiB
Python
import inspect
|
|
import optparse
|
|
import shlex
|
|
import sys
|
|
import time
|
|
|
|
import lldb
|
|
|
|
|
|
class ProgressTesterCommand:
|
|
program = "test-progress"
|
|
|
|
@classmethod
|
|
def register_lldb_command(cls, debugger, module_name):
|
|
parser = cls.create_options()
|
|
cls.__doc__ = parser.format_help()
|
|
# Add any commands contained in this module to LLDB
|
|
command = "command script add -c %s.%s %s" % (
|
|
module_name,
|
|
cls.__name__,
|
|
cls.program,
|
|
)
|
|
debugger.HandleCommand(command)
|
|
print(
|
|
'The "{0}" command has been installed, type "help {0}" or "{0} '
|
|
'--help" for detailed help.'.format(cls.program)
|
|
)
|
|
|
|
@classmethod
|
|
def create_options(cls):
|
|
usage = "usage: %prog [options]"
|
|
description = "SBProgress testing tool"
|
|
# Opt parse is deprecated, but leaving this the way it is because it allows help formating
|
|
# Additionally all our commands use optparse right now, ideally we migrate them all in one go.
|
|
parser = optparse.OptionParser(
|
|
description=description, prog=cls.program, usage=usage
|
|
)
|
|
|
|
parser.add_option(
|
|
"--total",
|
|
dest="total",
|
|
help="Total items in this progress object. When this option is not specified, this will be an indeterminate progress.",
|
|
type="int",
|
|
default=None,
|
|
)
|
|
|
|
parser.add_option(
|
|
"--seconds",
|
|
dest="seconds",
|
|
help="Total number of seconds to wait between increments",
|
|
type="int",
|
|
)
|
|
|
|
parser.add_option(
|
|
"--no-details",
|
|
dest="no_details",
|
|
help="Do not display details",
|
|
action="store_true",
|
|
default=False,
|
|
)
|
|
|
|
return parser
|
|
|
|
def get_short_help(self):
|
|
return "Progress Tester"
|
|
|
|
def get_long_help(self):
|
|
return self.help_string
|
|
|
|
def __init__(self, debugger, unused):
|
|
self.parser = self.create_options()
|
|
self.help_string = self.parser.format_help()
|
|
|
|
def __call__(self, debugger, command, exe_ctx, result):
|
|
command_args = shlex.split(command)
|
|
try:
|
|
(cmd_options, args) = self.parser.parse_args(command_args)
|
|
except:
|
|
result.SetError("option parsing failed")
|
|
return
|
|
|
|
total = cmd_options.total
|
|
if total is None:
|
|
progress = lldb.SBProgress(
|
|
"Progress tester", "Initial Indeterminate Detail", debugger
|
|
)
|
|
else:
|
|
progress = lldb.SBProgress(
|
|
"Progress tester", "Initial Detail", total, debugger
|
|
)
|
|
# Check to see if total is set to None to indicate an indeterminate
|
|
# progress then default to 3 steps.
|
|
with progress:
|
|
if total is None:
|
|
total = 3
|
|
|
|
for i in range(1, total):
|
|
if cmd_options.no_details:
|
|
progress.Increment(1)
|
|
else:
|
|
progress.Increment(1, f"Step {i}")
|
|
time.sleep(cmd_options.seconds)
|
|
|
|
|
|
def __lldb_init_module(debugger, dict):
|
|
# Register all classes that have a register_lldb_command method
|
|
for _name, cls in inspect.getmembers(sys.modules[__name__]):
|
|
if inspect.isclass(cls) and callable(
|
|
getattr(cls, "register_lldb_command", None)
|
|
):
|
|
cls.register_lldb_command(debugger, __name__)
|