-
Notifications
You must be signed in to change notification settings - Fork 15.2k
[lldb][test] Combine libstdc++ and libc++ std::string tests into generic test #147355
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
[lldb][test] Combine libstdc++ and libc++ std::string tests into generic test #147355
Conversation
…ric test This combines the libc++ and libstdc++ test cases. The main difference was that the libstdcpp tests had additional tests for references/pointers to std::string. I moved those over. Split out from llvm#146740
|
@llvm/pr-subscribers-lldb Author: Michael Buch (Michael137) ChangesThis combines the libc++ and libstdc++ test cases. The main difference was that the libstdcpp tests had additional tests for references/pointers to std::string. I moved those over. The libstdc++ formatters don't support There were also two test assertions that failed for libstdc++:
I put those in separate XFAILed test-cases. Split out from #146740 Patch is 29.05 KiB, truncated to 20.00 KiB below, full version: https://github.com/llvm/llvm-project/pull/147355.diff 7 Files Affected:
diff --git a/lldb/test/API/functionalities/data-formatter/data-formatter-stl/libstdcpp/string/Makefile b/lldb/test/API/functionalities/data-formatter/data-formatter-stl/generic/string/Makefile
similarity index 53%
rename from lldb/test/API/functionalities/data-formatter/data-formatter-stl/libstdcpp/string/Makefile
rename to lldb/test/API/functionalities/data-formatter/data-formatter-stl/generic/string/Makefile
index c825977b1a5dc..99998b20bcb05 100644
--- a/lldb/test/API/functionalities/data-formatter/data-formatter-stl/libstdcpp/string/Makefile
+++ b/lldb/test/API/functionalities/data-formatter/data-formatter-stl/generic/string/Makefile
@@ -1,6 +1,3 @@
CXX_SOURCES := main.cpp
-CFLAGS_EXTRAS := -O0
-USE_LIBSTDCPP := 1
-
include Makefile.rules
diff --git a/lldb/test/API/functionalities/data-formatter/data-formatter-stl/libcxx/string/TestDataFormatterLibcxxString.py b/lldb/test/API/functionalities/data-formatter/data-formatter-stl/generic/string/TestDataFormatterStdString.py
similarity index 52%
rename from lldb/test/API/functionalities/data-formatter/data-formatter-stl/libcxx/string/TestDataFormatterLibcxxString.py
rename to lldb/test/API/functionalities/data-formatter/data-formatter-stl/generic/string/TestDataFormatterStdString.py
index 2f7fc88e0f449..2991cf870dcd2 100644
--- a/lldb/test/API/functionalities/data-formatter/data-formatter-stl/libcxx/string/TestDataFormatterLibcxxString.py
+++ b/lldb/test/API/functionalities/data-formatter/data-formatter-stl/generic/string/TestDataFormatterStdString.py
@@ -10,7 +10,7 @@
from lldbsuite.test import lldbutil
-class LibcxxStringDataFormatterTestCase(TestBase):
+class StdStringDataFormatterTestCase(TestBase):
def setUp(self):
# Call super's setUp().
TestBase.setUp(self)
@@ -18,17 +18,8 @@ def setUp(self):
self.main_spec = lldb.SBFileSpec("main.cpp")
self.namespace = "std"
- @add_test_categories(["libc++"])
- @expectedFailureAll(
- bugnumber="llvm.org/pr36109", debug_info="gmodules", triple=".*-android"
- )
- # Inline namespace is randomly ignored as Clang due to broken lookup inside
- # the std namespace.
- @expectedFailureAll(debug_info="gmodules")
- def test_with_run_command(self):
+ def do_test(self):
"""Test that that file and class static variables display correctly."""
- self.build()
-
(target, process, thread, bkpt) = lldbutil.run_to_source_breakpoint(
self, "Set break point at this line.", self.main_spec
)
@@ -47,42 +38,13 @@ def cleanup():
ns = self.namespace
- self.expect(
- "frame variable",
- substrs=[
- '(%s::wstring) wempty = L""' % ns,
- '(%s::wstring) s = L"hello world! מזל טוב!"' % ns,
- '(%s::wstring) S = L"!!!!"' % ns,
- "(const wchar_t *) mazeltov = 0x",
- 'L"מזל טוב"',
- '(%s::string) empty = ""' % ns,
- '(%s::string) q = "hello world"' % ns,
- '(%s::string) Q = "quite a long std::strin with lots of info inside it"'
- % ns,
- '(%s::string) IHaveEmbeddedZeros = "a\\0b\\0c\\0d"' % ns,
- '(%s::wstring) IHaveEmbeddedZerosToo = L"hello world!\\0てざ ル゜䋨ミ㠧槊 きゅへ狦穤襩 じゃ馩リョ 䤦監"'
- % ns,
- '(%s::u16string) u16_string = u"ß水氶"' % ns,
- '(%s::u16string) u16_empty = u""' % ns,
- '(%s::u32string) u32_string = U"🍄🍅🍆🍌"' % ns,
- '(%s::u32string) u32_empty = U""' % ns,
- "(%s::string *) null_str = nullptr" % ns,
- ],
- )
+ # Check 'S' pre-assignment.
+ self.expect("frame variable S", substrs=['(%s::wstring) S = L"!!!!"' % ns])
thread.StepOver()
TheVeryLongOne = frame.FindVariable("TheVeryLongOne")
summaryOptions = lldb.SBTypeSummaryOptions()
- summaryOptions.SetCapping(lldb.eTypeSummaryUncapped)
- uncappedSummaryStream = lldb.SBStream()
- TheVeryLongOne.GetSummary(uncappedSummaryStream, summaryOptions)
- uncappedSummary = uncappedSummaryStream.GetData()
- self.assertGreater(
- uncappedSummary.find("someText"),
- 0,
- "uncappedSummary does not include the full string",
- )
summaryOptions.SetCapping(lldb.eTypeSummaryCapped)
cappedSummaryStream = lldb.SBStream()
TheVeryLongOne.GetSummary(cappedSummaryStream, summaryOptions)
@@ -108,31 +70,145 @@ def cleanup():
self.expect(
"frame variable",
substrs=[
+ '(%s::wstring) wempty = L""' % ns,
+ '(%s::wstring) s = L"hello world! מזל טוב!"' % ns,
'(%s::wstring) S = L"!!!!!"' % ns,
"(const wchar_t *) mazeltov = 0x",
'L"מזל טוב"',
+ '(%s::string) empty = ""' % ns,
'(%s::string) q = "hello world"' % ns,
'(%s::string) Q = "quite a long std::strin with lots of info inside it"'
% ns,
+ "(%s::string *) null_str = nullptr" % ns,
+ ],
+ )
+
+ # Test references and pointers to std::string.
+ var_rq = self.frame().FindVariable("rq")
+ var_rQ = self.frame().FindVariable("rQ")
+ var_pq = self.frame().FindVariable("pq")
+ var_pQ = self.frame().FindVariable("pQ")
+
+ self.assertEqual(var_rq.GetSummary(), '"hello world"', "rq summary wrong")
+ self.assertEqual(
+ var_rQ.GetSummary(),
+ '"quite a long std::strin with lots of info inside it"',
+ "rQ summary wrong",
+ )
+ self.assertEqual(var_pq.GetSummary(), '"hello world"', "pq summary wrong")
+ self.assertEqual(
+ var_pQ.GetSummary(),
+ '"quite a long std::strin with lots of info inside it"',
+ "pQ summary wrong",
+ )
+
+ @expectedFailureAll(
+ bugnumber="llvm.org/pr36109", debug_info="gmodules", triple=".*-android"
+ )
+ # Inline namespace is randomly ignored as Clang due to broken lookup inside
+ # the std namespace.
+ @expectedFailureAll(debug_info="gmodules")
+ @add_test_categories(["libc++"])
+ def test_libcxx(self):
+ self.build(dictionary={"USE_LIBCPP": 1})
+ self.do_test()
+
+ @expectedFailureAll(
+ bugnumber="llvm.org/pr36109", debug_info="gmodules", triple=".*-android"
+ )
+ # Inline namespace is randomly ignored as Clang due to broken lookup inside
+ # the std namespace.
+ @expectedFailureAll(debug_info="gmodules")
+ @add_test_categories(["libstdcxx"])
+ def test_libstdcxx(self):
+ self.build(dictionary={"USE_LIBSTDCPP": 1})
+ self.do_test()
+
+ def do_test_multibyte(self):
+ lldbutil.run_to_source_breakpoint(
+ self, "Set break point at this line.", self.main_spec
+ )
+
+ ns = self.namespace
+
+ self.expect(
+ "frame variable",
+ substrs=[
'(%s::string) IHaveEmbeddedZeros = "a\\0b\\0c\\0d"' % ns,
'(%s::wstring) IHaveEmbeddedZerosToo = L"hello world!\\0てざ ル゜䋨ミ㠧槊 きゅへ狦穤襩 じゃ馩リョ 䤦監"'
% ns,
'(%s::u16string) u16_string = u"ß水氶"' % ns,
+ '(%s::u16string) u16_empty = u""' % ns,
'(%s::u32string) u32_string = U"🍄🍅🍆🍌"' % ns,
'(%s::u32string) u32_empty = U""' % ns,
- "(%s::string *) null_str = nullptr" % ns,
],
)
- # Finally, make sure that if the string is not readable, we give an error:
- bkpt_2 = target.BreakpointCreateBySourceRegex(
- "Break here to look at bad string", self.main_spec
+ @add_test_categories(["libc++"])
+ def test_multibyte_libcxx(self):
+ self.build(dictionary={"USE_LIBCPP": 1})
+ self.do_test_multibyte()
+
+ @expectedFailureAll(
+ bugnumber="libstdc++ formatters don't support UTF-16/UTF-32 strings yet."
+ )
+ @add_test_categories(["libstdcxx"])
+ def test_multibyte_libstdcxx(self):
+ self.build(dictionary={"USE_LIBSTDCPP": 1})
+ self.do_test_multibyte()
+
+ def do_test_uncapped_summary(self):
+ lldbutil.run_to_source_breakpoint(
+ self, "Set break point at this line.", self.main_spec
+ )
+
+ TheVeryLongOne = frame.FindVariable("TheVeryLongOne")
+ summaryOptions = lldb.SBTypeSummaryOptions()
+ summaryOptions.SetCapping(lldb.eTypeSummaryUncapped)
+ uncappedSummaryStream = lldb.SBStream()
+ TheVeryLongOne.GetSummary(uncappedSummaryStream, summaryOptions)
+ uncappedSummary = uncappedSummaryStream.GetData()
+ self.assertGreater(
+ uncappedSummary.find("someText"),
+ 0,
+ "uncappedSummary does not include the full string",
)
- self.assertEqual(bkpt_2.GetNumLocations(), 1, "Got one location")
- threads = lldbutil.continue_to_breakpoint(process, bkpt_2)
- self.assertEqual(len(threads), 1, "Stopped at second breakpoint")
- frame = threads[0].frames[0]
- var = frame.FindVariable("in_str")
- self.assertTrue(var.GetError().Success(), "Made variable")
+
+ @add_test_categories(["libc++"])
+ def test_uncapped_libcxx(self):
+ self.build(dictionary={"USE_LIBCPP": 1})
+ self.do_test_uncapped_summary()
+
+ @expectedFailureAll(
+ bugnumber="libstdc++ std::string summary provider doesn't obey summary options."
+ )
+ @add_test_categories(["libstdcxx"])
+ def test_uncapped_libstdcxx(self):
+ self.build(dictionary={"USE_LIBSTDCPP": 1})
+ self.do_test_uncapped_summary()
+
+ def do_test_summary_unavailable(self):
+ """
+ Make sure that if the string is not readable, we give an error.
+ """
+ (_, _, thread, _) = lldbutil.run_to_source_breakpoint(
+ self, "Break here to look at bad string", self.main_spec
+ )
+
+ var = thread.frames[0].FindVariable("in_str")
+ self.assertTrue(var.GetError().Success(), "Found variable")
summary = var.GetSummary()
self.assertEqual(summary, "Summary Unavailable", "No summary for bad value")
+
+ @add_test_categories(["libc++"])
+ def test_unavailable_summary_libcxx(self):
+ self.build(dictionary={"USE_LIBCPP": 1})
+ self.do_test_summary_unavailable()
+
+ @expectedFailureAll(
+ bugnumber="libstdc++ std::string summary provider doesn't output a user-friendly message for invalid strings."
+ )
+ @add_test_categories(["libstdcxx"])
+ def test_unavailable_summary_libstdcxx(self):
+ self.build(dictionary={"USE_LIBSTDCPP": 1})
+ self.do_test_summary_unavailable()
diff --git a/lldb/test/API/functionalities/data-formatter/data-formatter-stl/generic/string/main.cpp b/lldb/test/API/functionalities/data-formatter/data-formatter-stl/generic/string/main.cpp
new file mode 100644
index 0000000000000..db695ed06f015
--- /dev/null
+++ b/lldb/test/API/functionalities/data-formatter/data-formatter-stl/generic/string/main.cpp
@@ -0,0 +1,104 @@
+#include <stdint.h>
+#include <string>
+
+size_t touch_string(std::string &in_str) {
+ return in_str.size(); // Break here to look at bad string
+}
+
+int main() {
+ std::wstring wempty(L"");
+ std::wstring s(L"hello world! מזל טוב!");
+ std::wstring S(L"!!!!");
+ const wchar_t *mazeltov = L"מזל טוב";
+ std::string empty("");
+ std::string q("hello world");
+ std::string Q("quite a long std::strin with lots of info inside it");
+ std::string TheVeryLongOne(
+ "123456789012345678901234567890123456789012345678901234567890123456789012"
+ "345678901234567890123456789012345678901234567890123456789012345678901234"
+ "567890123456789012345678901234567890123456789012345678901234567890123456"
+ "789012345678901234567890123456789012345678901234567890123456789012345678"
+ "901234567890123456789012345678901234567890123456789012345678901234567890"
+ "123456789012345678901234567890123456789012345678901234567890123456789012"
+ "345678901234567890123456789012345678901234567890123456789012345678901234"
+ "567890123456789012345678901234567890123456789012345678901234567890123456"
+ "789012345678901234567890123456789012345678901234567890123456789012345678"
+ "901234567890123456789012345678901234567890123456789012345678901234567890"
+ "123456789012345678901234567890123456789012345678901234567890123456789012"
+ "345678901234567890123456789012345678901234567890123456789012345678901234"
+ "567890123456789012345678901234567890123456789012345678901234567890123456"
+ "789012345678901234567890123456789012345678901234567890123456789012345678"
+ "901234567890123456789012345678901234567890123456789012345678901234567890"
+ "123456789012345678901234567890123456789012345678901234567890123456789012"
+ "345678901234567890123456789012345678901234567890123456789012345678901234"
+ "567890123456789012345678901234567890123456789012345678901234567890123456"
+ "789012345678901234567890123456789012345678901234567890123456789012345678"
+ "901234567890123456789012345678901234567890123456789012345678901234567890"
+ "123456789012345678901234567890123456789012345678901234567890123456789012"
+ "345678901234567890123456789012345678901234567890123456789012345678901234"
+ "567890123456789012345678901234567890123456789012345678901234567890123456"
+ "789012345678901234567890123456789012345678901234567890123456789012345678"
+ "901234567890123456789012345678901234567890123456789012345678901234567890"
+ "123456789012345678901234567890123456789012345678901234567890123456789012"
+ "345678901234567890123456789012345678901234567890123456789012345678901234"
+ "567890123456789012345678901234567890123456789012345678901234567890123456"
+ "789012345678901234567890123456789012345678901234567890123456789012345678"
+ "901234567890123456789012345678901234567890123456789012345678901234567890"
+ "123456789012345678901234567890123456789012345678901234567890123456789012"
+ "345678901234567890123456789012345678901234567890123456789012345678901234"
+ "567890123456789012345678901234567890123456789012345678901234567890123456"
+ "789012345678901234567890123456789012345678901234567890123456789012345678"
+ "9012345678901234567890123456789012345678901234567890someText123456789012"
+ "345678901234567890123456789012345678901234567890123456789012345678901234"
+ "567890123456789012345678901234567890123456789012345678901234567890123456"
+ "789012345678901234567890123456789012345678901234567890123456789012345678"
+ "901234567890123456789012345678901234567890123456789012345678901234567890"
+ "123456789012345678901234567890123456789012345678901234567890123456789012"
+ "345678901234567890123456789012345678901234567890123456789012345678901234"
+ "567890123456789012345678901234567890123456789012345678901234567890123456"
+ "789012345678901234567890123456789012345678901234567890123456789012345678"
+ "901234567890123456789012345678901234567890123456789012345678901234567890"
+ "123456789012345678901234567890123456789012345678901234567890123456789012"
+ "345678901234567890123456789012345678901234567890123456789012345678901234"
+ "567890123456789012345678901234567890123456789012345678901234567890123456"
+ "789012345678901234567890123456789012345678901234567890123456789012345678"
+ "901234567890123456789012345678901234567890123456789012345678901234567890"
+ "123456789012345678901234567890123456789012345678901234567890123456789012"
+ "345678901234567890123456789012345678901234567890123456789012345678901234"
+ "567890123456789012345678901234567890123456789012345678901234567890123456"
+ "789012345678901234567890123456789012345678901234567890123456789012345678"
+ "901234567890123456789012345678901234567890123456789012345678901234567890"
+ "123456789012345678901234567890123456789012345678901234567890123456789012"
+ "345678901234567890123456789012345678901234567890123456789012345678901234"
+ "567890123456789012345678901234567890123456789012345678901234567890123456"
+ "789012345678901234567890123456789012345678901234567890123456789012345678"
+ "901234567890123456789012345678901234567890123456789012345678901234567890"
+ "123456789012345678901234567890123456789012345678901234567890123456789012"
+ "345678901234567890123456789012345678901234567890123456789012345678901234"
+ "567890123456789012345678901234567890123456789012345678901234567890123456"
+ "789012345678901234567890123456789012345678901234567890123456789012345678"
+ "901234567890123456789012345678901234567890123456789012345678901234567890"
+ "123456789012345678901234567890123456789012345678901234567890123456789012"
+ "345678901234567890123456789012345678901234567890123456789012345678901234"
+ "567890123456789012345678901234567890123456789012345678901234567890123456"
+ "789012345678901234567890123456789012345678901234567890123456789012345678"
+ "901234567890123456789012345678901234567890123456789012345678901234567890"
+ "1234567890123456789012345678901234567890");
+ std::string IHaveEmbeddedZeros("a\0b\0c\0d", 7);
+ std::wstring IHaveEmbeddedZerosToo(
+ L"hello world!\0てざ ル゜䋨ミ㠧槊 きゅへ狦穤襩 じゃ馩リョ 䤦監", 38);
+ std::u16string u16_string(u"ß水氶");
+ std::u16string u16_empty(u"");
+ std::u32string u32_string(U"🍄🍅🍆🍌");
+ std::u32string u32_empty(U"");
+ std::string *null_str = nullptr;
+ auto &rq = q;
+ auto &rQ = Q;
+ std::string *pq = &q;
+ std::string *pQ = &Q;
+
+ S.assign(L"!!!!!"); // Set break point at this line.
+ std::string *not_a_string = (std::string *)0x0;
+ touch_string(*not_a_string);
+ return 0;
+}
diff --git a/lldb/test/API/functionalities/data-formatter/data-formatter-stl/libcxx/string/Makefile b/lldb/test/API/functionalities/data-formatter/data-formatter-stl/libcxx/string/Makefile
deleted file mode 100644
index c7c91da728d1e..0000000000000
--- a/lldb/test/API/functionalities/data-formatter/data-formatter-stl/libcxx/string/Makefile
+++ /dev/null
@@ -1,6 +0,0 @@
-CXX_SOURCES := main.cpp
-
-USE_LIBCPP := 1
-
-CXXFLAGS_EXTRAS := -std=c++11 -O0
-include Makefile.rules
diff --git a/lldb/test/API/functionalities/data-formatter/data-formatter-stl/libcxx/string/main.cpp b/lldb/test/API/functionalities/data-formatter/data-formatter-stl/libcxx/string/main.cpp
deleted file mode 100644
index 373f817a80f7d..0000000000000
--- a/lldb/test/API/functionalities/data-formatter/data-formatter-stl/libcxx/string/main.cpp
+++ /dev/null
@@ -1,31 +0,0 @@
-#include <string>
-#include <stdint.h>
-
-size_t touch_string(std::string &in_str)
-{
- return in_str.size(); // Break here to look at bad string
-}
-
-int main()
-{
- std::wstring wempty(L"");
- std::wstring s(L"hello world! מזל טוב!");
- std::wstring S(L"!!!!");
- const wchar_t *mazeltov = L"מזל טוב";
- std::string empty("");
- std::string q("hello world");
- std::string Q("quite a long std::strin with lots of info inside it");
- std::string TheVeryLongOne("123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567...
[truncated]
|
labath
left a comment
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
FWIW, I don't find (null) nor Summary Unavailable particularly good summaries for (std::string*)NULL. At least in Python, I believe that returning an empty string from the summary provider causes lldb to treat it as not present and show the raw value of the object. In case the object is corrupted, I think that's the best we can do.
This combines the libc++ and libstdc++ test cases. The main difference was that the libstdcpp tests had additional tests for references/pointers to std::string. I moved those over.
The libstdc++ formatters don't support
std::u16string/std::u32stringyet, so I extracted those into XFAILed test cases.There were also two test assertions that failed for libstdc++:
I put those in separate XFAILed test-cases.
Split out from #146740