Skip to content

[lldb][test] Move std::string_view from libcxx to generic directory #147563

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

Merged
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I guess this one is a mistake.

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Whoops yes

File renamed without changes.
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
CXX_SOURCES := main.cpp
CXXFLAGS_EXTRAS := -std=c++17

include Makefile.rules
Original file line number Diff line number Diff line change
@@ -0,0 +1,165 @@
# coding=utf8
"""
Test lldb data formatter subsystem.
"""


import lldb
from lldbsuite.test.decorators import *
from lldbsuite.test.lldbtest import *
from lldbsuite.test import lldbutil


class StdStringViewDataFormatterTestCase(TestBase):
def setUp(self):
# Call super's setUp().
TestBase.setUp(self)
# Find the line number to break at.
self.line1 = line_number("main.cpp", "// Set break point at this line.")
self.line2 = line_number(
"main.cpp", "// Break here to look at bad string view."
)

def do_test(self):
"""Test that that file and class static variables display correctly."""
self.runCmd("file " + self.getBuildArtifact("a.out"), CURRENT_EXECUTABLE_SET)

lldbutil.run_break_set_by_file_and_line(
self, "main.cpp", self.line1, num_expected_locations=-1
)
lldbutil.run_break_set_by_file_and_line(
self, "main.cpp", self.line2, num_expected_locations=-1
)

self.runCmd("run", RUN_SUCCEEDED)

# The stop reason of the thread should be breakpoint.
self.expect(
"thread list",
STOPPED_DUE_TO_BREAKPOINT,
substrs=["stopped", "stop reason = breakpoint"],
)

# This is the function to remove the custom formats in order to have a
# clean slate for the next test case.
def cleanup():
self.runCmd("type format clear", check=False)
self.runCmd("type summary clear", check=False)
self.runCmd("type filter clear", check=False)
self.runCmd("type synth clear", check=False)

# Execute the cleanup function during test case tear down.
self.addTearDownHook(cleanup)

self.expect_var_path("wempty", type="std::wstring_view", summary='L""')
self.expect_var_path(
"s", type="std::wstring_view", summary='L"hello world! מזל טוב!"'
)
self.expect_var_path("S", type="std::wstring_view", summary='L"!!!!"')
self.expect_var_path("empty", type="std::string_view", summary='""')
self.expect_var_path("q_source", type="std::string", summary='"hello world"')
self.expect_var_path("q", type="std::string_view", summary='"hello world"')
self.expect_var_path(
"Q",
type="std::string_view",
summary='"quite a long std::strin with lots of info inside it"',
)
self.expect_var_path(
"IHaveEmbeddedZeros", type="std::string_view", summary='"a\\0b\\0c\\0d"'
)
self.expect_var_path(
"IHaveEmbeddedZerosToo",
type="std::wstring_view",
summary='L"hello world!\\0てざ ル゜䋨ミ㠧槊 きゅへ狦穤襩 じゃ馩リョ 䤦監"',
)
self.expect_var_path("u16_string", type="std::u16string_view", summary='u"ß水氶"')
self.expect_var_path("u16_empty", type="std::u16string_view", summary='u""')
self.expect_var_path(
"u32_string", type="std::u32string_view", summary='U"🍄🍅🍆🍌"'
)
self.expect_var_path("u32_empty", type="std::u32string_view", summary='U""')
self.expect_var_path(
"oops", type="std::string_view", summary='"Hellooo World\\n"'
)

# GetSummary returns None so can't be checked by expect_var_path, so we
# use the str representation instead
null_obj = self.frame().GetValueForVariablePath("null_str")
self.assertEqual(null_obj.GetSummary(), "Summary Unavailable")
self.assertEqual(str(null_obj), "(std::string_view *) null_str = nullptr")

self.runCmd("n")

TheVeryLongOne = self.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)
cappedSummary = cappedSummaryStream.GetData()
self.assertLessEqual(
cappedSummary.find("someText"), 0, "cappedSummary includes the full string"
)

self.expect_expr(
"s",
result_type="std::wstring_view",
result_summary='L"hello world! מזל טוב!"',
)

self.expect_var_path("wempty", type="std::wstring_view", summary='L""')
self.expect_var_path(
"s", type="std::wstring_view", summary='L"hello world! מזל טוב!"'
)
self.expect_var_path("S", type="std::wstring_view", summary='L"!!!!"')
self.expect_var_path("empty", type="std::string_view", summary='""')
self.expect_var_path("q_source", type="std::string", summary='"Hello world"')
self.expect_var_path("q", type="std::string_view", summary='"Hello world"')
self.expect_var_path(
"Q",
type="std::string_view",
summary='"quite a long std::strin with lots of info inside it"',
)
self.expect_var_path(
"IHaveEmbeddedZeros", type="std::string_view", summary='"a\\0b\\0c\\0d"'
)
self.expect_var_path(
"IHaveEmbeddedZerosToo",
type="std::wstring_view",
summary='L"hello world!\\0てざ ル゜䋨ミ㠧槊 きゅへ狦穤襩 じゃ馩リョ 䤦監"',
)
self.expect_var_path("u16_string", type="std::u16string_view", summary='u"ß水氶"')
self.expect_var_path("u16_empty", type="std::u16string_view", summary='u""')
self.expect_var_path(
"u32_string", type="std::u32string_view", summary='U"🍄🍅🍆🍌"'
)
self.expect_var_path("u32_empty", type="std::u32string_view", summary='U""')

self.runCmd("cont")
self.expect(
"thread list",
STOPPED_DUE_TO_BREAKPOINT,
substrs=["stopped", "stop reason = breakpoint"],
)

broken_obj = self.frame().GetValueForVariablePath("in_str_view")
self.assertEqual(broken_obj.GetSummary(), "Summary Unavailable")

@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()

This file was deleted.

Loading