"""
Check that missing module source files are correctly handled by LLDB.
"""
from lldbsuite.test.decorators import *
from lldbsuite.test.lldbtest import *
from lldbsuite.test import lldbutil
import os
import shutil
class TestCase(TestBase):
# We only emulate a fake libc++ in this test and don't use the real libc++,
# but we still add the libc++ category so that this test is only run in
# test configurations where libc++ is actually supposed to be tested.
@add_test_categories(["libc++"])
@skipIf(compiler=no_match("clang"))
@skipIfRemote
def test(self):
# The path to our temporary target root that contains the temporary
# module sources.
target_sysroot = self.getBuildArtifact("root")
# Copy the sources to the root.
shutil.copytree(self.getSourcePath("root"), target_sysroot)
# Build the binary with the copied sources.
self.build()
# Delete the copied sources so that they are now unavailable.
shutil.rmtree(target_sysroot)
# Set the sysroot where our dummy libc++ used to exist. Just to make
# sure we don't find some existing headers on the system that could
# XPASS this test.
self.runCmd("platform select --sysroot '" + target_sysroot + "' host")
lldbutil.run_to_source_breakpoint(
self, "// Set break point at this line.", lldb.SBFileSpec("main.cpp")
)
# Import the std C++ module and run an expression.
# As we deleted the sources, LLDB should refuse the load the module
# and just print the normal error we get from the expression.
self.runCmd("settings set target.import-std-module true")
self.expect(
"expr v.unknown_identifier",
error=True,
substrs=["no member named 'unknown_identifier'"],
)
# Check that there is no confusing error about failing to build the
# module.
self.expect(
"expr v.unknown_identifier",
error=True,
matching=False,
substrs=["could not build module 'std'"],
)
# Test the fallback mode. It should also just print the normal
# error but not mention a failed module build.
self.runCmd("settings set target.import-std-module fallback")
self.expect(
"expr v.unknown_identifier",
error=True,
substrs=["no member named 'unknown_identifier'"],
)
self.expect(
"expr v.unknown_identifier",
error=True,
matching=False,
substrs=["could not build module 'std'"],
)