This removes the dependency LLDB API tests have on lldb/third_party/Python/module/unittest2, and instead uses the standard one provided by Python. This does not actually remove the vendored dep yet, nor update the docs. I'll do both those once this sticks. Non-trivial changes to call out: - expected failures (i.e. "bugnumber") don't have a reason anymore, so those params were removed - `assertItemsEqual` is now called `assertCountEqual` - When a test is marked xfail, our copy of unittest2 considers failures during teardown to be OK, but modern unittest does not. See TestThreadLocal.py. (Very likely could be a real bug/leak). - Our copy of unittest2 was patched to print all test results, even ones that don't happen, e.g. `(5 passes, 0 failures, 1 errors, 0 skipped, ...)`, but standard unittest prints a terser message that omits test result types that didn't happen, e.g. `OK (skipped=1)`. Our lit integration parses this stderr and needs to be updated w/ that expectation. I tested this w/ `ninja check-lldb-api` on Linux. There's a good chance non-Linux tests have similar quirks, but I'm not able to uncover those.
95 lines
3.4 KiB
Python
95 lines
3.4 KiB
Python
"""Test that types defined in shared libraries work correctly."""
|
|
|
|
|
|
import unittest
|
|
import lldb
|
|
from lldbsuite.test.decorators import *
|
|
from lldbsuite.test.lldbtest import *
|
|
import lldbsuite.test.lldbutil as lldbutil
|
|
|
|
|
|
class SharedLibTestCase(TestBase):
|
|
def common_test_expr(self, preload_symbols):
|
|
if "clang" in self.getCompiler() and "3.4" in self.getCompilerVersion():
|
|
self.skipTest(
|
|
"llvm.org/pr16214 -- clang emits partial DWARF for structures referenced via typedef"
|
|
)
|
|
|
|
self.build()
|
|
self.common_setup(preload_symbols)
|
|
|
|
# This should display correctly.
|
|
self.expect(
|
|
"expression --show-types -- *my_foo_ptr",
|
|
VARIABLES_DISPLAYED_CORRECTLY,
|
|
substrs=["(foo)", "(sub_foo)", "other_element = 3"],
|
|
)
|
|
|
|
self.expect("expression GetMeASubFoo(my_foo_ptr)", startstr="(sub_foo *) $")
|
|
|
|
def test_expr(self):
|
|
"""Test that types work when defined in a shared library and forward-declared in the main executable"""
|
|
self.common_test_expr(True)
|
|
|
|
def test_expr_no_preload(self):
|
|
"""Test that types work when defined in a shared library and forward-declared in the main executable, but with preloading disabled"""
|
|
self.common_test_expr(False)
|
|
|
|
@unittest.expectedFailure # llvm.org/PR36712
|
|
def test_frame_variable(self):
|
|
"""Test that types work when defined in a shared library and forward-declared in the main executable"""
|
|
self.build()
|
|
self.common_setup()
|
|
|
|
# This should display correctly.
|
|
self.expect(
|
|
"frame variable --show-types -- *my_foo_ptr",
|
|
VARIABLES_DISPLAYED_CORRECTLY,
|
|
substrs=["(foo)", "(sub_foo)", "other_element = 3"],
|
|
)
|
|
|
|
def setUp(self):
|
|
# Call super's setUp().
|
|
TestBase.setUp(self)
|
|
# Find the line number to break inside main().
|
|
self.source = "main.c"
|
|
self.line = line_number(self.source, "// Set breakpoint 0 here.")
|
|
self.shlib_names = ["foo"]
|
|
|
|
def common_setup(self, preload_symbols=True):
|
|
# Run in synchronous mode
|
|
self.dbg.SetAsync(False)
|
|
|
|
# Create a target by the debugger.
|
|
target = self.dbg.CreateTarget(self.getBuildArtifact("a.out"))
|
|
self.assertTrue(target, VALID_TARGET)
|
|
|
|
self.runCmd(
|
|
"settings set target.preload-symbols " + str(preload_symbols).lower()
|
|
)
|
|
|
|
# Break inside the foo function which takes a bar_ptr argument.
|
|
lldbutil.run_break_set_by_file_and_line(
|
|
self, self.source, self.line, num_expected_locations=1, loc_exact=True
|
|
)
|
|
|
|
# Register our shared libraries for remote targets so they get
|
|
# automatically uploaded
|
|
environment = self.registerSharedLibrariesWithTarget(target, self.shlib_names)
|
|
|
|
# Now launch the process, and do not stop at entry point.
|
|
process = target.LaunchSimple(
|
|
None, environment, self.get_process_working_directory()
|
|
)
|
|
self.assertTrue(process, PROCESS_IS_VALID)
|
|
|
|
# The stop reason of the thread should be breakpoint.
|
|
self.expect(
|
|
"thread list",
|
|
STOPPED_DUE_TO_BREAKPOINT,
|
|
substrs=["stopped", "stop reason = breakpoint"],
|
|
)
|
|
|
|
# The breakpoint should have a hit count of 1.
|
|
lldbutil.check_breakpoint(self, bpno=1, expected_hit_count=1)
|