From 37ec83fcfc6c7915c51268f578b8e0dadb54c1cf Mon Sep 17 00:00:00 2001 From: Jonas Devlieghere Date: Fri, 14 Aug 2020 08:32:21 -0700 Subject: [PATCH] [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 --- .../TestBundleWithDotInFilename.py | 19 +++++++++++++------ .../bundle-with-dot-in-filename/main.c | 6 +++++- .../find-dsym/deep-bundle/TestDeepBundle.py | 16 +++++++++++++--- .../API/macosx/find-dsym/deep-bundle/main.c | 2 ++ 4 files changed, 33 insertions(+), 10 deletions(-) diff --git a/lldb/test/API/macosx/find-dsym/bundle-with-dot-in-filename/TestBundleWithDotInFilename.py b/lldb/test/API/macosx/find-dsym/bundle-with-dot-in-filename/TestBundleWithDotInFilename.py index 2572600a1829..e12a638f9c03 100644 --- a/lldb/test/API/macosx/find-dsym/bundle-with-dot-in-filename/TestBundleWithDotInFilename.py +++ b/lldb/test/API/macosx/find-dsym/bundle-with-dot-in-filename/TestBundleWithDotInFilename.py @@ -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() diff --git a/lldb/test/API/macosx/find-dsym/bundle-with-dot-in-filename/main.c b/lldb/test/API/macosx/find-dsym/bundle-with-dot-in-filename/main.c index 30761eb1b409..a4cffc840731 100644 --- a/lldb/test/API/macosx/find-dsym/bundle-with-dot-in-filename/main.c +++ b/lldb/test/API/macosx/find-dsym/bundle-with-dot-in-filename/main.c @@ -1,10 +1,11 @@ #include #include #include +#include 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 diff --git a/lldb/test/API/macosx/find-dsym/deep-bundle/TestDeepBundle.py b/lldb/test/API/macosx/find-dsym/deep-bundle/TestDeepBundle.py index a486c5159f01..358a4b70d2f5 100644 --- a/lldb/test/API/macosx/find-dsym/deep-bundle/TestDeepBundle.py +++ b/lldb/test/API/macosx/find-dsym/deep-bundle/TestDeepBundle.py @@ -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 diff --git a/lldb/test/API/macosx/find-dsym/deep-bundle/main.c b/lldb/test/API/macosx/find-dsym/deep-bundle/main.c index b5ef5cff74a3..0a44b96068c2 100644 --- a/lldb/test/API/macosx/find-dsym/deep-bundle/main.c +++ b/lldb/test/API/macosx/find-dsym/deep-bundle/main.c @@ -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