[Lldb-commits] [lldb] [lldb] Move TestBase.runCmd() to the Base class (PR #92252)

2024-05-16 Thread Dmitry Vasilyev via lldb-commits

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)

2024-05-16 Thread Pavel Labath via lldb-commits

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)

2024-05-15 Thread via lldb-commits

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)

2024-05-15 Thread Dmitry Vasilyev via lldb-commits

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():
+