[Lldb-commits] [lldb] [lldb] Support ordered patterns in lldbtest.expect (PR #131475)
Dave Lee via lldb-commits
lldb-commits at lists.llvm.org
Sat Mar 15 14:54:27 PDT 2025
https://github.com/kastiglione updated https://github.com/llvm/llvm-project/pull/131475
>From dd2bf73c7118ba70dc0640f10cbdc25ef6886648 Mon Sep 17 00:00:00 2001
From: Dave Lee <davelee.com at gmail.com>
Date: Sat, 15 Mar 2025 11:20:36 -0700
Subject: [PATCH 1/2] [lldb] Support ordered patterns in lldbtest.expect
Change `lldbtest.expect` to search the given `patterns` in order, if the `ordered`
parameter is true.
The `ordered` parameter is true by default, so this change also fixes tests by either
tweaking the patterns to work in order, or by setting `ordered=False`.
I have often wanted to test with `patterns` and also verify the order. This change
allows that.
---
lldb/packages/Python/lldbsuite/test/lldbtest.py | 17 +++++++++--------
.../functionalities/alias/TestBtAliasRepeat.py | 2 +-
.../TestDataFormatterObjCNSContainer.py | 2 ++
.../TestDataFormatterGenericUnordered.py | 4 ++--
.../libcxx/span/TestDataFormatterLibcxxSpan.py | 2 +-
.../TestRootReferenceChildren.py | 4 ++--
.../lang/cpp/signed_types/TestSignedTypes.py | 2 +-
.../API/lang/objc/foundation/TestObjCMethods.py | 2 +-
.../API/source-manager/TestSourceManager.py | 1 +
9 files changed, 20 insertions(+), 16 deletions(-)
diff --git a/lldb/packages/Python/lldbsuite/test/lldbtest.py b/lldb/packages/Python/lldbsuite/test/lldbtest.py
index 590024ef77119..fa9105b701dcd 100644
--- a/lldb/packages/Python/lldbsuite/test/lldbtest.py
+++ b/lldb/packages/Python/lldbsuite/test/lldbtest.py
@@ -2460,9 +2460,9 @@ def found_str(matched):
if substrs and matched == matching:
start = 0
for substr in substrs:
- index = output[start:].find(substr)
- start = start + index + len(substr) if ordered and matching else 0
+ index = output.find(substr, start)
matched = index != -1
+ start = index + len(substr) if ordered and matched else 0
log_lines.append(
'{} sub string: "{}" ({})'.format(
expecting_str, substr, found_str(matched)
@@ -2473,20 +2473,21 @@ def found_str(matched):
break
if patterns and matched == matching:
+ start = 0
for pattern in patterns:
- matched = re.search(pattern, output)
+ pat = re.compile(pattern)
+ match = pat.search(output, start)
+ matched = bool(match)
+ start = match.end() if ordered and matched else 0
pattern_line = '{} regex pattern: "{}" ({}'.format(
expecting_str, pattern, found_str(matched)
)
- if matched:
- pattern_line += ', matched "{}"'.format(matched.group(0))
+ if match:
+ pattern_line += ', matched "{}"'.format(match.group(0))
pattern_line += ")"
log_lines.append(pattern_line)
- # Convert to bool because match objects
- # are True-ish but is not True itself
- matched = bool(matched)
if matched != matching:
break
diff --git a/lldb/test/API/functionalities/alias/TestBtAliasRepeat.py b/lldb/test/API/functionalities/alias/TestBtAliasRepeat.py
index 42b5accddc0ba..60c0dd0a233bf 100644
--- a/lldb/test/API/functionalities/alias/TestBtAliasRepeat.py
+++ b/lldb/test/API/functionalities/alias/TestBtAliasRepeat.py
@@ -9,7 +9,7 @@ def test(self):
lldbutil.run_to_source_breakpoint(self, "return", lldb.SBFileSpec("main.c"))
# Expect "frame #0" but not "frame #1".
- self.expect("bt 1", inHistory=True, patterns=["frame #0", "^(?!.*frame #1)"])
+ self.expect("bt 1", inHistory=True, patterns=["frame #0", "(?!.*frame #1)"])
# Run an empty command to run the repeat command for `bt`.
# The repeat command for `bt N` lists the subsequent N frames.
diff --git a/lldb/test/API/functionalities/data-formatter/data-formatter-objc/TestDataFormatterObjCNSContainer.py b/lldb/test/API/functionalities/data-formatter/data-formatter-objc/TestDataFormatterObjCNSContainer.py
index c90a5c61d9c0b..e6fb549945666 100644
--- a/lldb/test/API/functionalities/data-formatter/data-formatter-objc/TestDataFormatterObjCNSContainer.py
+++ b/lldb/test/API/functionalities/data-formatter/data-formatter-objc/TestDataFormatterObjCNSContainer.py
@@ -52,6 +52,7 @@ def nscontainers_data_formatter_commands(self):
self.expect(
"frame variable -d run-target *nscfDictionary",
+ ordered=False,
patterns=[
r"\(__NSCFDictionary\) \*nscfDictionary =",
'key = 0x.* @"foo"',
@@ -67,6 +68,7 @@ def nscontainers_data_formatter_commands(self):
self.expect(
"frame variable -d run-target *cfDictionaryRef",
+ ordered=False,
patterns=[
r"\(const __CFDictionary\) \*cfDictionaryRef =",
'key = 0x.* @"foo"',
diff --git a/lldb/test/API/functionalities/data-formatter/data-formatter-stl/generic/unordered/TestDataFormatterGenericUnordered.py b/lldb/test/API/functionalities/data-formatter/data-formatter-stl/generic/unordered/TestDataFormatterGenericUnordered.py
index 50dfbbf6b90a5..71cd12f3a3d56 100644
--- a/lldb/test/API/functionalities/data-formatter/data-formatter-stl/generic/unordered/TestDataFormatterGenericUnordered.py
+++ b/lldb/test/API/functionalities/data-formatter/data-formatter-stl/generic/unordered/TestDataFormatterGenericUnordered.py
@@ -122,8 +122,8 @@ def cleanup():
)
def look_for_content_and_continue(self, var_name, patterns):
- self.expect(("frame variable %s" % var_name), patterns=patterns)
- self.expect(("frame variable %s" % var_name), patterns=patterns)
+ self.expect(("frame variable %s" % var_name), ordered=False, patterns=patterns)
+ self.expect(("frame variable %s" % var_name), ordered=False, patterns=patterns)
self.runCmd("continue")
@add_test_categories(["libstdcxx"])
diff --git a/lldb/test/API/functionalities/data-formatter/data-formatter-stl/libcxx/span/TestDataFormatterLibcxxSpan.py b/lldb/test/API/functionalities/data-formatter/data-formatter-stl/libcxx/span/TestDataFormatterLibcxxSpan.py
index 4df4fa1acc8e7..42efe415b6acf 100644
--- a/lldb/test/API/functionalities/data-formatter/data-formatter-stl/libcxx/span/TestDataFormatterLibcxxSpan.py
+++ b/lldb/test/API/functionalities/data-formatter/data-formatter-stl/libcxx/span/TestDataFormatterLibcxxSpan.py
@@ -172,4 +172,4 @@ def test_ref_and_ptr(self):
# The pointer should just show the right number of elements:
- self.expect("frame variable ptr", patterns=["ptr = 0x.*", " size=5"])
+ self.expect("frame variable ptr", patterns=["ptr = 0x[0-9a-f]+ size=5"])
diff --git a/lldb/test/API/functionalities/data-formatter/root-reference-children/TestRootReferenceChildren.py b/lldb/test/API/functionalities/data-formatter/root-reference-children/TestRootReferenceChildren.py
index 5de66177e7cad..7c366445b1c6e 100644
--- a/lldb/test/API/functionalities/data-formatter/root-reference-children/TestRootReferenceChildren.py
+++ b/lldb/test/API/functionalities/data-formatter/root-reference-children/TestRootReferenceChildren.py
@@ -20,8 +20,8 @@ def test(self):
"v summary_and_children_ref", substrs=["some summary", "child = 30"]
)
self.expect(
- "v summary_only_ref", patterns=["some summary", "(?s)^(?!.*child = )"]
+ "v summary_only_ref", patterns=["some summary", "(?s)(?!.*child = )"]
)
self.expect(
- "v children_only_ref", patterns=["(?s)^(?!.*some summary)", "child = 30"]
+ "v children_only_ref", patterns=["(?s)(?!.*some summary)", "child = 30"]
)
diff --git a/lldb/test/API/lang/cpp/signed_types/TestSignedTypes.py b/lldb/test/API/lang/cpp/signed_types/TestSignedTypes.py
index b8c2c23613868..2a5c9bb1bd766 100644
--- a/lldb/test/API/lang/cpp/signed_types/TestSignedTypes.py
+++ b/lldb/test/API/lang/cpp/signed_types/TestSignedTypes.py
@@ -57,8 +57,8 @@ def test(self):
"frame variable --show-types --no-args",
VARIABLES_DISPLAYED_CORRECTLY,
patterns=[
- r"\((short int|short)\) the_signed_short = 99",
r"\((signed char|char)\) the_signed_char = 'c'",
+ r"\((short int|short)\) the_signed_short = 99",
],
substrs=[
"(int) the_signed_int = 99",
diff --git a/lldb/test/API/lang/objc/foundation/TestObjCMethods.py b/lldb/test/API/lang/objc/foundation/TestObjCMethods.py
index 5fa3f280d33bf..e82cb2f308602 100644
--- a/lldb/test/API/lang/objc/foundation/TestObjCMethods.py
+++ b/lldb/test/API/lang/objc/foundation/TestObjCMethods.py
@@ -166,7 +166,7 @@ def test_data_type_and_expr(self):
"frame variable --show-types --scope",
VARIABLES_DISPLAYED_CORRECTLY,
substrs=["ARG: (MyString *) self"],
- patterns=[r"ARG: \(.*\) _cmd", "(objc_selector *)|(SEL)"],
+ patterns=[r"ARG: \(SEL|objc_selector \*\) _cmd"],
)
# rdar://problem/8651752
diff --git a/lldb/test/API/source-manager/TestSourceManager.py b/lldb/test/API/source-manager/TestSourceManager.py
index 1283c73e152a9..eca0dd5e6159f 100644
--- a/lldb/test/API/source-manager/TestSourceManager.py
+++ b/lldb/test/API/source-manager/TestSourceManager.py
@@ -129,6 +129,7 @@ def do_display_source_python_api(
stream.GetData(),
"Source code displayed correctly:\n" + stream.GetData(),
exe=False,
+ ordered=False,
patterns=["=>", "%d.*Hello world" % self.line, needle_regex],
)
>From 25a0978cfd57f94a75ef4d196497180bf4efeea1 Mon Sep 17 00:00:00 2001
From: Dave Lee <davelee.com at gmail.com>
Date: Sat, 15 Mar 2025 14:54:01 -0700
Subject: [PATCH 2/2] Update expect's docstring
---
lldb/packages/Python/lldbsuite/test/lldbtest.py | 5 +++--
1 file changed, 3 insertions(+), 2 deletions(-)
diff --git a/lldb/packages/Python/lldbsuite/test/lldbtest.py b/lldb/packages/Python/lldbsuite/test/lldbtest.py
index fa9105b701dcd..f350fee5fad48 100644
--- a/lldb/packages/Python/lldbsuite/test/lldbtest.py
+++ b/lldb/packages/Python/lldbsuite/test/lldbtest.py
@@ -2356,8 +2356,9 @@ def expect(
matches the patterns contained in 'patterns'.
When matching is true and ordered is true, which are both the default,
- the strings in the substrs array have to appear in the command output
- in the order in which they appear in the array.
+ the strings in the substrs array, and regex in the patterns array, have
+ to appear in the command output in the order in which they appear in
+ their respective array.
If the keyword argument error is set to True, it signifies that the API
client is expecting the command to fail. In this case, the error stream
More information about the lldb-commits
mailing list