[lldb] Use file to synchronize TestDeepBundle and TestBundleWithDotInFilename

Currently these two tests use an arbitrary wait of 5 seconds for the
inferior to finish setting up. When the test machine is under heavy load
this sometimes is insufficient leading to spurious test failures. This
patch adds synchronization trough a token on the file system. In
addition to making the test more reliable it also makes it much faster
because we no longer have to wait the full 5 seconds if the setup was
completed faster than that.

Differential revision: https://reviews.llvm.org/D85915
This commit is contained in:
Jonas Devlieghere 2020-08-14 08:32:21 -07:00
parent 1c80a6ce5f
commit 37ec83fcfc
4 changed files with 33 additions and 10 deletions

View File

@ -32,15 +32,25 @@ class BundleWithDotInFilenameTestCase(TestBase):
@skipUnlessDarwin
# This test is explicitly a dSYM test, it doesn't need to run for any other config.
@skipIf(debug_info=no_match(["dsym"]))
@skipIfReproducer # File synchronization is not supported during replay.
def test_attach_and_check_dsyms(self):
"""Test attach to binary, see if the bundle dSYM is found"""
exe = self.getBuildArtifact(exe_name)
self.build()
os.chdir(self.getBuildDir());
popen = self.spawnSubprocess(exe)
# Give the inferior time to start up, dlopen a bundle, remove the bundle it linked in
sleep(5)
# Use a file as a synchronization point between test and inferior.
pid_file_path = lldbutil.append_to_process_working_directory(self,
"token_pid_%d" % (int(os.getpid())))
self.addTearDownHook(
lambda: self.run_platform_command(
"rm %s" %
(pid_file_path)))
popen = self.spawnSubprocess(exe, [pid_file_path])
# Wait for the inferior to start up, dlopen a bundle, remove the bundle it linked in
pid = lldbutil.wait_for_file_on_target(self, pid_file_path)
# Since the library that was dlopen()'ed is now removed, lldb will need to find the
# binary & dSYM via target.exec-search-paths
@ -64,6 +74,3 @@ class BundleWithDotInFilenameTestCase(TestBase):
self.assertTrue (dsym_name == 'com.apple.sbd', "Check that we found the dSYM for the bundle that was loaded")
i=i+1
os.chdir(self.getSourceDir());
if __name__ == '__main__':
unittest.main()

View File

@ -1,10 +1,11 @@
#include <dlfcn.h>
#include <unistd.h>
#include <stdlib.h>
#include <stdio.h>
int setup_is_complete = 0;
int main()
int main(int argc, const char** argv)
{
void *handle = dlopen ("com.apple.sbd.xpc/com.apple.sbd", RTLD_NOW);
@ -13,6 +14,9 @@ int main()
if (dlsym(handle, "foo"))
{
system ("/bin/rm -rf com.apple.sbd.xpc com.apple.sbd.xpc.dSYM");
FILE *fp = fopen (argv[1], "w");
fclose (fp);
setup_is_complete = 1;
// At this point we want lldb to attach to the process. If lldb attaches

View File

@ -31,14 +31,24 @@ class DeepBundleTestCase(TestBase):
@skipUnlessDarwin
# This test is explicitly a dSYM test, it doesn't need to run for any other config.
@skipIf(debug_info=no_match(["dsym"]))
@skipIfReproducer # File synchronization is not supported during replay.
def test_attach_and_check_dsyms(self):
"""Test attach to binary, see if the framework dSYM is found"""
exe = self.getBuildArtifact(exe_name)
self.build()
popen = self.spawnSubprocess(exe, [self.getBuildDir()])
# Give the inferior time to start up, dlopen a bundle, remove the bundle it linked in
sleep(5)
# Use a file as a synchronization point between test and inferior.
pid_file_path = lldbutil.append_to_process_working_directory(self,
"token_pid_%d" % (int(os.getpid())))
self.addTearDownHook(
lambda: self.run_platform_command(
"rm %s" %
(pid_file_path)))
popen = self.spawnSubprocess(exe, [self.getBuildDir(), pid_file_path])
# Wait for the inferior to start up, dlopen a bundle, remove the bundle it linked in
pid = lldbutil.wait_for_file_on_target(self, pid_file_path)
# Since the library that was dlopen()'ed is now removed, lldb will need to find the
# binary & dSYM via target.exec-search-paths

View File

@ -13,6 +13,8 @@ int main(int argc, const char **argv)
argv[1], argv[1], argv[1]);
system (command);
FILE *fp = fopen (argv[2], "w");
fclose (fp);
setup_is_complete = 1;
// At this point we want lldb to attach to the process. If lldb attaches