Build each testcase variant in its own subdirectory and remove the srcdir lock file

This patch creates a <test>.dwarf, <test>.dwo, etc., build directory for each testcase variant.
Most importantly, this eliminates the need for the per-test lock file in the source directory.

Tests that are marked as NO_DEBUG_INFO_TESTCASE and build with
buildDefault() are built in a <test>.default build directory.

Differential Revision: https://reviews.llvm.org/D42763

llvm-svn: 324368
This commit is contained in:
Adrian Prantl
2018-02-06 18:22:51 +00:00
parent 2f6412c389
commit 332351d9b9
13 changed files with 131 additions and 148 deletions

View File

@@ -23,10 +23,10 @@ class ListenToModuleLoadedEvents (TestBase):
def setUp(self):
# Call super's setUp().
TestBase.setUp(self)
self.build()
def test_receiving_breakpoint_added(self):
"""Test that we get breakpoint added events, waiting on event classes on the debugger"""
self.build()
my_listener = lldb.SBListener("test_listener")

View File

@@ -28,8 +28,6 @@ class CompDirSymLinkTestCase(TestBase):
self.line = line_number(
os.path.join(self.getSourceDir(), "main.cpp"),
'// Set break point at this line.')
self.src_path = self.getBuildArtifact(_SRC_FILE)
@skipIf(hostoslist=["windows"])
def test_symlink_paths_set(self):
@@ -38,7 +36,8 @@ class CompDirSymLinkTestCase(TestBase):
self.runCmd(
"settings set %s %s" %
(_COMP_DIR_SYM_LINK_PROP, pwd_symlink))
lldbutil.run_break_set_by_file_and_line(self, self.src_path, self.line)
src_path = self.getBuildArtifact(_SRC_FILE)
lldbutil.run_break_set_by_file_and_line(self, src_path, self.line)
@skipIf(hostoslist=no_match(["linux"]))
def test_symlink_paths_set_procselfcwd(self):
@@ -48,21 +47,24 @@ class CompDirSymLinkTestCase(TestBase):
self.runCmd(
"settings set %s %s" %
(_COMP_DIR_SYM_LINK_PROP, pwd_symlink))
lldbutil.run_break_set_by_file_and_line(self, self.src_path, self.line)
src_path = self.getBuildArtifact(_SRC_FILE)
lldbutil.run_break_set_by_file_and_line(self, src_path, self.line)
@skipIf(hostoslist=["windows"])
def test_symlink_paths_unset(self):
pwd_symlink = self.create_src_symlink()
self.doBuild(pwd_symlink)
self.runCmd('settings clear ' + _COMP_DIR_SYM_LINK_PROP)
src_path = self.getBuildArtifact(_SRC_FILE)
self.assertRaises(
AssertionError,
lldbutil.run_break_set_by_file_and_line,
self,
self.src_path,
src_path,
self.line)
def create_src_symlink(self):
self.makeBuildDir()
pwd_symlink = self.getBuildArtifact('pwd_symlink')
if os.path.exists(pwd_symlink):
os.unlink(pwd_symlink)

View File

@@ -22,13 +22,18 @@ class LoadUnloadTestCase(TestBase):
def setUp(self):
# Call super's setUp().
TestBase.setUp(self)
lldbutil.mkdir_p(self.getBuildArtifact("hidden"))
self.setup_test()
# Invoke the default build rule.
self.build()
# Find the line number to break for main.cpp.
self.line = line_number(
'main.cpp',
'// Set break point at this line for test_lldb_process_load_and_unload_commands().')
self.line_d_function = line_number(
'd.cpp', '// Find this line number within d_dunction().')
def setup_test(self):
lldbutil.mkdir_p(self.getBuildArtifact("hidden"))
if not self.platformIsDarwin():
if not lldb.remote_platform and "LD_LIBRARY_PATH" in os.environ:
self.runCmd(
@@ -94,10 +99,6 @@ class LoadUnloadTestCase(TestBase):
@skipIfWindows # Windows doesn't have dlopen and friends, dynamic libraries work differently
def test_modules_search_paths(self):
"""Test target modules list after loading a different copy of the library libd.dylib, and verifies that it works with 'target modules search-paths add'."""
# Invoke the default build rule.
self.build()
if self.platformIsDarwin():
dylibName = 'libloadunload_d.dylib'
else:
@@ -157,9 +158,6 @@ class LoadUnloadTestCase(TestBase):
@skipIfWindows # Windows doesn't have dlopen and friends, dynamic libraries work differently
def test_dyld_library_path(self):
"""Test (DY)LD_LIBRARY_PATH after moving libd.dylib, which defines d_function, somewhere else."""
# Invoke the default build rule.
self.build()
self.copy_shlibs_to_remote(hidden_dir=True)
exe = self.getBuildArtifact("a.out")
@@ -222,9 +220,6 @@ class LoadUnloadTestCase(TestBase):
@skipIfWindows # Windows doesn't have dlopen and friends, dynamic libraries work differently
def test_lldb_process_load_and_unload_commands(self):
"""Test that lldb process load/unload command work correctly."""
# Invoke the default build rule.
self.build()
self.copy_shlibs_to_remote()
exe = self.getBuildArtifact("a.out")
@@ -296,9 +291,6 @@ class LoadUnloadTestCase(TestBase):
@skipIfFreeBSD # llvm.org/pr14424 - missing FreeBSD Makefiles/testcase support
def test_load_unload(self):
"""Test breakpoint by name works correctly with dlopen'ing."""
# Invoke the default build rule.
self.build()
self.copy_shlibs_to_remote()
exe = self.getBuildArtifact("a.out")
@@ -339,9 +331,6 @@ class LoadUnloadTestCase(TestBase):
@skipIfWindows # Windows doesn't have dlopen and friends, dynamic libraries work differently
def test_step_over_load(self):
"""Test stepping over code that loads a shared library works correctly."""
# Invoke the default build rule.
self.build()
self.copy_shlibs_to_remote()
exe = self.getBuildArtifact("a.out")
@@ -374,8 +363,6 @@ class LoadUnloadTestCase(TestBase):
@skipIfWindows # Windows doesn't have dlopen and friends, dynamic libraries work differently
def test_static_init_during_load(self):
"""Test that we can set breakpoints correctly in static initializers"""
self.build()
self.copy_shlibs_to_remote()
exe = self.getBuildArtifact("a.out")

View File

@@ -22,8 +22,10 @@ class TestValueOfVectorVariableTestCase(TestBase):
bugnumber="llvm.org/pr24446: WINDOWS XFAIL TRIAGE - Watchpoints not supported on Windows")
def test_value_of_vector_variable_using_watchpoint_set(self):
"""Test verify displayed value of vector variable."""
self.build(dictionary=self.d)
self.setTearDownCleanup(dictionary=self.d)
exe = self.getBuildArtifact("a.out")
d = {'C_SOURCES': self.source, 'EXE': exe}
self.build(dictionary=d)
self.setTearDownCleanup(dictionary=d)
self.value_of_vector_variable_with_watchpoint_set()
def setUp(self):
@@ -31,8 +33,6 @@ class TestValueOfVectorVariableTestCase(TestBase):
TestBase.setUp(self)
# Our simple source filename.
self.source = 'main.c'
self.exe_name = self.getBuildArtifact("a.out")
self.d = {'C_SOURCES': self.source, 'EXE': self.exe_name}
def value_of_vector_variable_with_watchpoint_set(self):
"""Test verify displayed value of vector variable"""

View File

@@ -92,9 +92,9 @@ class InlineTest(TestBase):
# The test was skipped altogether.
return ""
elif self.using_dsym:
return "-N dwarf %s" % (self.mydir)
return "-N dwarf " + self.mydir
else:
return "-N dsym %s" % (self.mydir)
return "-N dsym " + self.mydir
def BuildMakefile(self):
self.makeBuildDir()

View File

@@ -523,11 +523,14 @@ class Base(unittest2.TestCase):
@staticmethod
def compute_mydir(test_file):
'''Subclasses should call this function to correctly calculate the required "mydir" attribute as follows:
'''Subclasses should call this function to correctly calculate the
required "mydir" attribute as follows:
mydir = TestBase.compute_mydir(__file__)'''
test_dir = os.path.dirname(test_file)
return test_dir[len(os.environ["LLDB_TEST"]) + 1:]
mydir = TestBase.compute_mydir(__file__)
'''
# /abs/path/to/packages/group/subdir/mytest.py -> group/subdir
rel_prefix = test_file[len(os.environ["LLDB_TEST"]) + 1:]
return os.path.dirname(rel_prefix)
def TraceOn(self):
"""Returns True if we are in trace mode (tracing detailed test execution)."""
@@ -549,32 +552,11 @@ class Base(unittest2.TestCase):
# Change current working directory if ${LLDB_TEST} is defined.
# See also dotest.py which sets up ${LLDB_TEST}.
if ("LLDB_TEST" in os.environ):
full_dir = os.path.join(os.environ["LLDB_TEST"], cls.mydir)
full_dir = os.path.join(os.environ["LLDB_TEST"],
cls.mydir)
if traceAlways:
print("Change dir to:", full_dir, file=sys.stderr)
os.chdir(os.path.join(os.environ["LLDB_TEST"], cls.mydir))
# TODO: Obsolete this by creating one working dir per configuration.
if debug_confirm_directory_exclusivity:
import lock
cls.dir_lock = lock.Lock(os.path.join(full_dir, ".dirlock"))
try:
cls.dir_lock.try_acquire()
# write the class that owns the lock into the lock file
cls.dir_lock.handle.write(cls.__name__)
except IOError as ioerror:
# nothing else should have this directory lock
# wait here until we get a lock
cls.dir_lock.acquire()
# read the previous owner from the lock file
lock_id = cls.dir_lock.handle.read()
print(
"LOCK ERROR: {} wants to lock '{}' but it is already locked by '{}'".format(
cls.__name__,
full_dir,
lock_id),
file=sys.stderr)
raise ioerror
os.chdir(full_dir)
# Set platform context.
cls.platformContext = lldbplatformutil.createPlatformContext()
@@ -725,14 +707,17 @@ class Base(unittest2.TestCase):
def getBuildDir(self):
"""Return the full path to the current test."""
return os.path.join(os.environ["LLDB_BUILD"], self.mydir)
variant = self.getDebugInfo()
if variant is None:
variant = 'default'
return os.path.join(os.environ["LLDB_BUILD"], self.mydir,
self.testMethodName)
def makeBuildDir(self):
"""Create the test-specific working directory."""
# See also dotest.py which sets up ${LLDB_BUILD}.
try: os.makedirs(self.getBuildDir())
except: pass
lldbutil.mkdir_p(self.getBuildDir())
def getBuildArtifact(self, name="a.out"):
"""Return absolute path to an artifact in the test's build directory."""
@@ -1516,18 +1501,17 @@ class Base(unittest2.TestCase):
architecture=None,
compiler=None,
dictionary=None,
clean=True,
testdir=None):
clean=True):
"""Platform specific way to build the default binaries."""
if not testdir:
testdir = self.mydir
testdir = self.mydir
testname = self.testMethodName
if self.getDebugInfo():
raise Exception("buildDefault tests must set NO_DEBUG_INFO_TESTCASE")
module = builder_module()
self.makeBuildDir()
dictionary = lldbplatformutil.finalize_build_dictionary(dictionary)
if not module.buildDefault(self, architecture, compiler,
dictionary, clean, testdir):
dictionary, clean, testdir, testname):
raise Exception("Don't know how to build default binary")
def buildDsym(
@@ -1535,18 +1519,17 @@ class Base(unittest2.TestCase):
architecture=None,
compiler=None,
dictionary=None,
clean=True,
testdir=None):
clean=True):
"""Platform specific way to build binaries with dsym info."""
if not testdir:
testdir = self.mydir
testdir = self.mydir
testname = self.testMethodName
if self.getDebugInfo() != "dsym":
raise Exception("NO_DEBUG_INFO_TESTCASE must build with buildDefault")
module = builder_module()
dictionary = lldbplatformutil.finalize_build_dictionary(dictionary)
if not module.buildDsym(self, architecture, compiler,
dictionary, clean, testdir):
dictionary, clean, testdir, testname):
raise Exception("Don't know how to build binary with dsym")
def buildDwarf(
@@ -1554,18 +1537,17 @@ class Base(unittest2.TestCase):
architecture=None,
compiler=None,
dictionary=None,
clean=True,
testdir=None):
clean=True):
"""Platform specific way to build binaries with dwarf maps."""
if not testdir:
testdir = self.mydir
testdir = self.mydir
testname = self.testMethodName
if self.getDebugInfo() != "dwarf":
raise Exception("NO_DEBUG_INFO_TESTCASE must build with buildDefault")
module = builder_module()
dictionary = lldbplatformutil.finalize_build_dictionary(dictionary)
if not module.buildDwarf(self, architecture, compiler,
dictionary, clean, testdir):
dictionary, clean, testdir, testname):
raise Exception("Don't know how to build binary with dwarf")
def buildDwo(
@@ -1573,18 +1555,17 @@ class Base(unittest2.TestCase):
architecture=None,
compiler=None,
dictionary=None,
clean=True,
testdir=None):
clean=True):
"""Platform specific way to build binaries with dwarf maps."""
if not testdir:
testdir = self.mydir
testdir = self.mydir
testname = self.testMethodName
if self.getDebugInfo() != "dwo":
raise Exception("NO_DEBUG_INFO_TESTCASE must build with buildDefault")
module = builder_module()
dictionary = lldbplatformutil.finalize_build_dictionary(dictionary)
if not module.buildDwo(self, architecture, compiler,
dictionary, clean, testdir):
dictionary, clean, testdir, testname):
raise Exception("Don't know how to build binary with dwo")
def buildGModules(
@@ -1592,18 +1573,17 @@ class Base(unittest2.TestCase):
architecture=None,
compiler=None,
dictionary=None,
clean=True,
testdir=None):
clean=True):
"""Platform specific way to build binaries with gmodules info."""
if not testdir:
testdir = self.mydir
testdir = self.mydir
testname = self.testMethodName
if self.getDebugInfo() != "gmodules":
raise Exception("NO_DEBUG_INFO_TESTCASE must build with buildDefault")
module = builder_module()
dictionary = lldbplatformutil.finalize_build_dictionary(dictionary)
if not module.buildGModules(self, architecture, compiler,
dictionary, clean, testdir):
dictionary, clean, testdir, testname):
raise Exception("Don't know how to build binary with gmodules")
def buildGo(self):
@@ -1778,6 +1758,7 @@ class LLDBTestCaseFactory(type):
supported_categories = [
x for x in categories if test_categories.is_supported_on_platform(
x, target_platform, configuration.compiler)]
if "dsym" in supported_categories:
@decorators.add_test_categories(["dsym"])
@wraps(attrvalue)
@@ -2322,19 +2303,17 @@ class TestBase(Base):
dictionary = lldbplatformutil.finalize_build_dictionary(dictionary)
if self.getDebugInfo() is None:
return self.buildDefault(architecture, compiler, dictionary,
clean, self.mydir)
clean)
elif self.getDebugInfo() == "dsym":
return self.buildDsym(architecture, compiler, dictionary,
clean, self.mydir)
return self.buildDsym(architecture, compiler, dictionary, clean)
elif self.getDebugInfo() == "dwarf":
return self.buildDwarf(architecture, compiler, dictionary,
clean, self.mydir)
return self.buildDwarf(architecture, compiler, dictionary, clean)
elif self.getDebugInfo() == "dwo":
return self.buildDwo(architecture, compiler, dictionary,
clean, self.mydir)
clean)
elif self.getDebugInfo() == "gmodules":
return self.buildGModules(architecture, compiler, dictionary,
clean, self.mydir)
clean)
else:
self.fail("Can't build for debug info: %s" % self.getDebugInfo())

View File

@@ -50,9 +50,10 @@ def getArchFlag():
return ("ARCHFLAG=" + archflag) if archflag else ""
def getMake(test_subdir):
def getMake(test_subdir, test_name):
"""Returns the invocation for GNU make.
The argument test_subdir is the relative path to the testcase."""
The first argument is a tuple of the relative path to the testcase
and its filename stem."""
if platform.system() == "FreeBSD" or platform.system() == "NetBSD":
make = "gmake"
else:
@@ -61,19 +62,19 @@ def getMake(test_subdir):
# Construct the base make invocation.
lldb_test = os.environ["LLDB_TEST"]
lldb_build = os.environ["LLDB_BUILD"]
if not (lldb_test and lldb_build and test_subdir and
if not (lldb_test and lldb_build and test_subdir and test_name and
(not os.path.isabs(test_subdir))):
raise Exception("Could not derive test directories")
build_dir = os.path.join(lldb_build, test_subdir)
test_dir = os.path.join(lldb_test, test_subdir)
build_dir = os.path.join(lldb_build, test_subdir, test_name)
src_dir = os.path.join(lldb_test, test_subdir)
# This is a bit of a hack to make inline testcases work.
makefile = os.path.join(test_dir, "Makefile")
makefile = os.path.join(src_dir, "Makefile")
if not os.path.isfile(makefile):
makefile = os.path.join(build_dir, "Makefile")
return [make,
"VPATH="+test_dir,
"VPATH="+src_dir,
"-C", build_dir,
"-I", test_dir,
"-I", src_dir,
"-f", makefile]
@@ -140,12 +141,13 @@ def buildDefault(
compiler=None,
dictionary=None,
clean=True,
testdir=None):
testdir=None,
testname=None):
"""Build the binaries the default way."""
commands = []
if clean:
commands.append(getMake(testdir) + ["clean", getCmdLine(dictionary)])
commands.append(getMake(testdir) + ["all", getArchSpec(architecture),
commands.append(getMake(testdir, testname) + ["clean", getCmdLine(dictionary)])
commands.append(getMake(testdir, testname) + ["all", getArchSpec(architecture),
getCCSpec(compiler), getCmdLine(dictionary)])
runBuildCommands(commands, sender=sender)
@@ -160,13 +162,16 @@ def buildDwarf(
compiler=None,
dictionary=None,
clean=True,
testdir=None):
testdir=None,
testname=None):
"""Build the binaries with dwarf debug info."""
commands = []
if clean:
commands.append(getMake(testdir) + ["clean", getCmdLine(dictionary)])
commands.append(getMake(testdir) + ["MAKE_DSYM=NO", getArchSpec(
architecture), getCCSpec(compiler), getCmdLine(dictionary)])
commands.append(getMake(testdir, testname) +
["clean", getCmdLine(dictionary)])
commands.append(getMake(testdir, testname) +
["MAKE_DSYM=NO", getArchSpec(architecture),
getCCSpec(compiler), getCmdLine(dictionary)])
runBuildCommands(commands, sender=sender)
# True signifies that we can handle building dwarf.
@@ -179,12 +184,14 @@ def buildDwo(
compiler=None,
dictionary=None,
clean=True,
testdir=None):
testdir=None,
testname=None):
"""Build the binaries with dwarf debug info."""
commands = []
if clean:
commands.append(getMake(testdir) + ["clean", getCmdLine(dictionary)])
commands.append(getMake(testdir) +
commands.append(getMake(testdir, testname) +
["clean", getCmdLine(dictionary)])
commands.append(getMake(testdir, testname) +
["MAKE_DSYM=NO", "MAKE_DWO=YES",
getArchSpec(architecture),
getCCSpec(compiler),
@@ -201,12 +208,14 @@ def buildGModules(
compiler=None,
dictionary=None,
clean=True,
testdir=None):
testdir=None,
testname=None):
"""Build the binaries with dwarf debug info."""
commands = []
if clean:
commands.append(getMake(testdir) + ["clean", getCmdLine(dictionary)])
commands.append(getMake(testdir) +
commands.append(getMake(testdir, testname) +
["clean", getCmdLine(dictionary)])
commands.append(getMake(testdir, testname) +
["MAKE_DSYM=NO",
"MAKE_GMODULES=YES",
getArchSpec(architecture),

View File

@@ -11,13 +11,14 @@ def buildDsym(
compiler=None,
dictionary=None,
clean=True,
testdir=None):
testdir=None,
testname=None):
"""Build the binaries with dsym debug info."""
commands = []
if clean:
commands.append(getMake(testdir) + ["clean", getCmdLine(dictionary)])
commands.append(getMake(testdir) +
commands.append(getMake(testdir, testname) +
["clean", getCmdLine(dictionary)])
commands.append(getMake(testdir, testname) +
["MAKE_DSYM=YES",
getArchSpec(architecture),
getCCSpec(compiler),

View File

@@ -20,9 +20,6 @@ class HelloWorldTestCase(TestBase):
def setUp(self):
# Call super's setUp().
TestBase.setUp(self)
# Get the full path to our executable to be attached/debugged.
self.exe = self.getBuildArtifact(self.testMethodName)
self.d = {'EXE': self.testMethodName}
# Find a couple of the line numbers within main.c.
self.line1 = line_number('main.c', '// Set break point at this line.')
self.line2 = line_number('main.c', '// Waiting to be attached...')
@@ -37,9 +34,12 @@ class HelloWorldTestCase(TestBase):
@skipIfiOSSimulator
def test_with_process_launch_api(self):
"""Create target, breakpoint, launch a process, and then kill it."""
self.build(dictionary=self.d)
self.setTearDownCleanup(dictionary=self.d)
target = self.dbg.CreateTarget(self.exe)
# Get the full path to our executable to be attached/debugged.
exe = self.getBuildArtifact(self.testMethodName)
d = {'EXE': exe}
self.build(dictionary=d)
self.setTearDownCleanup(dictionary=d)
target = self.dbg.CreateTarget(exe)
breakpoint = target.BreakpointCreateByLocation("main.c", self.line1)
@@ -82,12 +82,14 @@ class HelloWorldTestCase(TestBase):
@expectedFailureAll(oslist=['ios', 'watchos', 'tvos', 'bridgeos'], bugnumber="<rdar://problem/34538611>") # old lldb-server has race condition, launching an inferior and then launching debugserver in quick succession sometimes fails
def test_with_attach_to_process_with_id_api(self):
"""Create target, spawn a process, and attach to it with process id."""
self.build(dictionary=self.d)
self.setTearDownCleanup(dictionary=self.d)
target = self.dbg.CreateTarget(self.exe)
exe = self.getBuildArtifact(self.testMethodName)
d = {'EXE': exe}
self.build(dictionary=d)
self.setTearDownCleanup(dictionary=d)
target = self.dbg.CreateTarget(exe)
# Spawn a new process
popen = self.spawnSubprocess(self.exe, ["abc", "xyz"])
popen = self.spawnSubprocess(exe, ["abc", "xyz"])
self.addTearDownHook(self.cleanupSubprocesses)
# Give the subprocess time to start and wait for user input
@@ -112,12 +114,14 @@ class HelloWorldTestCase(TestBase):
@expectedFailureAll(oslist=['ios', 'watchos', 'tvos', 'bridgeos'], bugnumber="<rdar://problem/34538611>") # old lldb-server has race condition, launching an inferior and then launching debugserver in quick succession sometimes fails
def test_with_attach_to_process_with_name_api(self):
"""Create target, spawn a process, and attach to it with process name."""
self.build(dictionary=self.d)
self.setTearDownCleanup(dictionary=self.d)
target = self.dbg.CreateTarget(self.exe)
exe = self.getBuildArtifact(self.testMethodName)
d = {'EXE': exe}
self.build(dictionary=d)
self.setTearDownCleanup(dictionary=d)
target = self.dbg.CreateTarget(exe)
# Spawn a new process
popen = self.spawnSubprocess(self.exe, ["abc", "xyz"])
popen = self.spawnSubprocess(exe, ["abc", "xyz"])
self.addTearDownHook(self.cleanupSubprocesses)
# Give the subprocess time to start and wait for user input
@@ -127,7 +131,7 @@ class HelloWorldTestCase(TestBase):
error = lldb.SBError()
# Pass 'False' since we don't want to wait for new instance of
# "hello_world" to be launched.
name = os.path.basename(self.exe)
name = os.path.basename(exe)
# While we're at it, make sure that passing a None as the process name
# does not hang LLDB.

View File

@@ -19,6 +19,8 @@ class ProcessIOTestCase(TestBase):
def setUp(self):
# Call super's setUp().
TestBase.setUp(self)
def setup_test(self):
# Get the full path to our executable to be debugged.
self.exe = self.getBuildArtifact("process_io")
self.local_input_file = self.getBuildArtifact("input.txt")
@@ -38,6 +40,7 @@ class ProcessIOTestCase(TestBase):
@expectedFlakeyLinux(bugnumber="llvm.org/pr26437")
def test_stdin_by_api(self):
"""Exercise SBProcess.PutSTDIN()."""
self.setup_test()
self.build()
self.create_target()
self.run_process(True)
@@ -49,6 +52,7 @@ class ProcessIOTestCase(TestBase):
@expectedFlakeyLinux(bugnumber="llvm.org/pr26437")
def test_stdin_redirection(self):
"""Exercise SBLaunchInfo::AddOpenFileAction() for STDIN without specifying STDOUT or STDERR."""
self.setup_test()
self.build()
self.create_target()
self.redirect_stdin()
@@ -62,6 +66,7 @@ class ProcessIOTestCase(TestBase):
@skipIfDarwinEmbedded # debugserver can't create/write files on the device
def test_stdout_redirection(self):
"""Exercise SBLaunchInfo::AddOpenFileAction() for STDOUT without specifying STDIN or STDERR."""
self.setup_test()
self.build()
self.create_target()
self.redirect_stdout()
@@ -76,6 +81,7 @@ class ProcessIOTestCase(TestBase):
@skipIfDarwinEmbedded # debugserver can't create/write files on the device
def test_stderr_redirection(self):
"""Exercise SBLaunchInfo::AddOpenFileAction() for STDERR without specifying STDIN or STDOUT."""
self.setup_test()
self.build()
self.create_target()
self.redirect_stderr()
@@ -90,6 +96,7 @@ class ProcessIOTestCase(TestBase):
@skipIfDarwinEmbedded # debugserver can't create/write files on the device
def test_stdout_stderr_redirection(self):
"""Exercise SBLaunchInfo::AddOpenFileAction() for STDOUT and STDERR without redirecting STDIN."""
self.setup_test()
self.build()
self.create_target()
self.redirect_stdout()

View File

@@ -73,10 +73,7 @@ class SymbolContextAPITestCase(TestBase):
str(compileUnit),
"The compile unit should match",
exe=False,
substrs=[
os.path.join(
self.mydir,
'main.c')])
substrs=[self.getSourcePath('main.c')])
function = context.GetFunction()
self.assertTrue(function)
@@ -92,8 +89,7 @@ class SymbolContextAPITestCase(TestBase):
lineEntry.GetFileSpec().GetDirectory(),
"The line entry should have the correct directory",
exe=False,
substrs=[
self.mydir])
substrs=[self.mydir])
self.expect(
lineEntry.GetFileSpec().GetFilename(),
"The line entry should have the correct filename",

View File

@@ -22,7 +22,6 @@ class SymbolContextTwoFilesTestCase(TestBase):
"""Test lookup by address in a module with multiple compilation units"""
self.build()
exe = self.getBuildArtifact("a.out")
target = self.dbg.CreateTarget(exe)
self.assertTrue(target, VALID_TARGET)
@@ -45,7 +44,6 @@ class SymbolContextTwoFilesTestCase(TestBase):
compile unit contains DW_AT_ranges and DW_AT_ranges_base attributes."""
self.build()
exe = self.getBuildArtifact("a.out")
target = self.dbg.CreateTarget(exe)
self.assertTrue(target, VALID_TARGET)

View File

@@ -20,16 +20,16 @@ class HelloWorldTestCase(TestBase):
def setUp(self):
# Call super's setUp().
TestBase.setUp(self)
# Get the full path to our executable to be attached/debugged.
self.exe = self.getBuildArtifact(self.testMethodName)
self.d = {'EXE': self.testMethodName}
@add_test_categories(['pyapi'])
def test_with_process_launch_api(self):
"""Test SBValue::GetValueDidChange"""
self.build(dictionary=self.d)
self.setTearDownCleanup(dictionary=self.d)
target = self.dbg.CreateTarget(self.exe)
# Get the full path to our executable to be attached/debugged.
exe = self.getBuildArtifact(self.testMethodName)
d = {'EXE': exe}
self.build(dictionary=d)
self.setTearDownCleanup(dictionary=d)
target = self.dbg.CreateTarget(exe)
breakpoint = target.BreakpointCreateBySourceRegex(
"break here", lldb.SBFileSpec("main.c"))