[Lldb-commits] [lldb] [lldb] Move TestBase.runCmd() to the Base class (PR #92252)
https://github.com/slydiman closed https://github.com/llvm/llvm-project/pull/92252 ___ lldb-commits mailing list lldb-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits
[Lldb-commits] [lldb] [lldb] Move TestBase.runCmd() to the Base class (PR #92252)
https://github.com/labath approved this pull request. https://github.com/llvm/llvm-project/pull/92252 ___ lldb-commits mailing list lldb-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits
[Lldb-commits] [lldb] [lldb] Move TestBase.runCmd() to the Base class (PR #92252)
llvmbot wrote: @llvm/pr-subscribers-lldb Author: Dmitry Vasilyev (slydiman) Changes runCmd() is called from Base.getCPUInfo() but implemented only in TestBase(Base). Usually it works if TestBase is used. But call getCPUInfo() from a class based on Base will cause something like ``` File "E:\projects\llvm-nino\lldb\llvm-project\lldb\packages\Python\lldbsuite\test\lldbtest.py", line 1256, in getCPUInfo self.runCmd('platform get-file "/proc/cpuinfo" ' + cpuinfo_path) AttributeError: 'TestGdbRemoteExpeditedRegisters' object has no attribute 'runCmd' ``` BTW, TestBase.setUp() called runCmd() before applying LLDB_MAX_LAUNCH_COUNT and LLDB_TIME_WAIT_NEXT_LAUNCH. This patch fixes the test TestGdbRemoteExpeditedRegisters in case of Windows host and Linux target. --- Full diff: https://github.com/llvm/llvm-project/pull/92252.diff 1 Files Affected: - (modified) lldb/packages/Python/lldbsuite/test/lldbtest.py (+65-65) ``diff diff --git a/lldb/packages/Python/lldbsuite/test/lldbtest.py b/lldb/packages/Python/lldbsuite/test/lldbtest.py index 5fd686c143e9f..1ad8ab6e6e462 100644 --- a/lldb/packages/Python/lldbsuite/test/lldbtest.py +++ b/lldb/packages/Python/lldbsuite/test/lldbtest.py @@ -531,6 +531,14 @@ class Base(unittest.TestCase): # Keep track of the old current working directory. oldcwd = None +# Maximum allowed attempts when launching the inferior process. +# Can be overridden by the LLDB_MAX_LAUNCH_COUNT environment variable. +maxLaunchCount = 1 + +# Time to wait before the next launching attempt in second(s). +# Can be overridden by the LLDB_TIME_WAIT_NEXT_LAUNCH environment variable. +timeWaitNextLaunch = 1.0 + @staticmethod def compute_mydir(test_file): """Subclasses should call this function to correctly calculate the @@ -796,6 +804,12 @@ def setUp(self): # import traceback # traceback.print_stack() +if "LLDB_MAX_LAUNCH_COUNT" in os.environ: +self.maxLaunchCount = int(os.environ["LLDB_MAX_LAUNCH_COUNT"]) + +if "LLDB_TIME_WAIT_NEXT_LAUNCH" in os.environ: +self.timeWaitNextLaunch = float(os.environ["LLDB_TIME_WAIT_NEXT_LAUNCH"]) + if "LIBCXX_PATH" in os.environ: self.libcxxPath = os.environ["LIBCXX_PATH"] else: @@ -937,6 +951,57 @@ def spawnSubprocess(self, executable, args=[], extra_env=None, install_remote=Tr self.subprocesses.append(proc) return proc +def runCmd(self, cmd, msg=None, check=True, trace=False, inHistory=False): +""" +Ask the command interpreter to handle the command and then check its +return status. +""" +# Fail fast if 'cmd' is not meaningful. +if cmd is None: +raise Exception("Bad 'cmd' parameter encountered") + +trace = True if traceAlways else trace + +if cmd.startswith("target create "): +cmd = cmd.replace("target create ", "file ") + +running = cmd.startswith("run") or cmd.startswith("process launch") + +for i in range(self.maxLaunchCount if running else 1): +with recording(self, trace) as sbuf: +print("runCmd:", cmd, file=sbuf) +if not check: +print("check of return status not required", file=sbuf) + +self.ci.HandleCommand(cmd, self.res, inHistory) + +with recording(self, trace) as sbuf: +if self.res.Succeeded(): +print("output:", self.res.GetOutput(), file=sbuf) +else: +print("runCmd failed!", file=sbuf) +print(self.res.GetError(), file=sbuf) + +if self.res.Succeeded(): +break +elif running: +# For process launch, wait some time before possible next try. +time.sleep(self.timeWaitNextLaunch) +with recording(self, trace) as sbuf: +print("Command '" + cmd + "' failed!", file=sbuf) + +if check: +output = "" +if self.res.GetOutput(): +output += "\nCommand output:\n" + self.res.GetOutput() +if self.res.GetError(): +output += "\nError output:\n" + self.res.GetError() +if msg: +msg += output +if cmd: +cmd += output +self.assertTrue(self.res.Succeeded(), msg if (msg) else CMD_MSG(cmd)) + def HideStdout(self): """Hide output to stdout from the user. @@ -1764,14 +1829,6 @@ class TestBase(Base, metaclass=LLDBTestCaseFactory): # test multiple times with various debug info types. NO_DEBUG_INFO_TESTCASE = False -# Maximum allowed attempts when launching the inferior process. -# Can be overridden by the LLDB_MAX_LAUNCH_COUNT environment variable. -maxLaunchCount = 1 - -# Time to wait before the next launching attempt in
[Lldb-commits] [lldb] [lldb] Move TestBase.runCmd() to the Base class (PR #92252)
https://github.com/slydiman created https://github.com/llvm/llvm-project/pull/92252 runCmd() is called from Base.getCPUInfo() but implemented only in TestBase(Base). Usually it works if TestBase is used. But call getCPUInfo() from a class based on Base will cause something like ``` File "E:\projects\llvm-nino\lldb\llvm-project\lldb\packages\Python\lldbsuite\test\lldbtest.py", line 1256, in getCPUInfo self.runCmd('platform get-file "/proc/cpuinfo" ' + cpuinfo_path) AttributeError: 'TestGdbRemoteExpeditedRegisters' object has no attribute 'runCmd' ``` BTW, TestBase.setUp() called runCmd() before applying LLDB_MAX_LAUNCH_COUNT and LLDB_TIME_WAIT_NEXT_LAUNCH. This patch fixes the test TestGdbRemoteExpeditedRegisters in case of Windows host and Linux target. >From 3df0ffbf3ff66b6ee9419adf288efc2bbdd2c949 Mon Sep 17 00:00:00 2001 From: Dmitry Vasilyev Date: Wed, 15 May 2024 15:54:25 +0400 Subject: [PATCH] [lldb] Move TestBase.runCmd() to the base class Base runCmd() is called from Base.getCPUInfo() but implemented only in TestBase(Base). Usually it works if TestBase is used. But call getCPUInfo() from a class based on Base will cause something like ``` File "E:\projects\llvm-nino\lldb\llvm-project\lldb\packages\Python\lldbsuite\test\lldbtest.py", line 1256, in getCPUInfo self.runCmd('platform get-file "/proc/cpuinfo" ' + cpuinfo_path) AttributeError: 'TestGdbRemoteExpeditedRegisters' object has no attribute 'runCmd' ``` BTW, TestBase.setUp() called runCmd() before applying LLDB_MAX_LAUNCH_COUNT and LLDB_TIME_WAIT_NEXT_LAUNCH. This patch fixes the test TestGdbRemoteExpeditedRegisters in case of Windows host and Linux target. --- .../Python/lldbsuite/test/lldbtest.py | 130 +- 1 file changed, 65 insertions(+), 65 deletions(-) diff --git a/lldb/packages/Python/lldbsuite/test/lldbtest.py b/lldb/packages/Python/lldbsuite/test/lldbtest.py index 5fd686c143e9f..1ad8ab6e6e462 100644 --- a/lldb/packages/Python/lldbsuite/test/lldbtest.py +++ b/lldb/packages/Python/lldbsuite/test/lldbtest.py @@ -531,6 +531,14 @@ class Base(unittest.TestCase): # Keep track of the old current working directory. oldcwd = None +# Maximum allowed attempts when launching the inferior process. +# Can be overridden by the LLDB_MAX_LAUNCH_COUNT environment variable. +maxLaunchCount = 1 + +# Time to wait before the next launching attempt in second(s). +# Can be overridden by the LLDB_TIME_WAIT_NEXT_LAUNCH environment variable. +timeWaitNextLaunch = 1.0 + @staticmethod def compute_mydir(test_file): """Subclasses should call this function to correctly calculate the @@ -796,6 +804,12 @@ def setUp(self): # import traceback # traceback.print_stack() +if "LLDB_MAX_LAUNCH_COUNT" in os.environ: +self.maxLaunchCount = int(os.environ["LLDB_MAX_LAUNCH_COUNT"]) + +if "LLDB_TIME_WAIT_NEXT_LAUNCH" in os.environ: +self.timeWaitNextLaunch = float(os.environ["LLDB_TIME_WAIT_NEXT_LAUNCH"]) + if "LIBCXX_PATH" in os.environ: self.libcxxPath = os.environ["LIBCXX_PATH"] else: @@ -937,6 +951,57 @@ def spawnSubprocess(self, executable, args=[], extra_env=None, install_remote=Tr self.subprocesses.append(proc) return proc +def runCmd(self, cmd, msg=None, check=True, trace=False, inHistory=False): +""" +Ask the command interpreter to handle the command and then check its +return status. +""" +# Fail fast if 'cmd' is not meaningful. +if cmd is None: +raise Exception("Bad 'cmd' parameter encountered") + +trace = True if traceAlways else trace + +if cmd.startswith("target create "): +cmd = cmd.replace("target create ", "file ") + +running = cmd.startswith("run") or cmd.startswith("process launch") + +for i in range(self.maxLaunchCount if running else 1): +with recording(self, trace) as sbuf: +print("runCmd:", cmd, file=sbuf) +if not check: +print("check of return status not required", file=sbuf) + +self.ci.HandleCommand(cmd, self.res, inHistory) + +with recording(self, trace) as sbuf: +if self.res.Succeeded(): +print("output:", self.res.GetOutput(), file=sbuf) +else: +print("runCmd failed!", file=sbuf) +print(self.res.GetError(), file=sbuf) + +if self.res.Succeeded(): +break +elif running: +# For process launch, wait some time before possible next try. +time.sleep(self.timeWaitNextLaunch) +with recording(self, trace) as sbuf: +print("Command '" + cmd + "' failed!", file=sbuf) + +if check: +output = "" +if self.res.GetOutput(): +