JDevlieghere created this revision. JDevlieghere added reviewers: aprantl, teemperor. JDevlieghere requested review of this revision.
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. Repository: rLLDB LLDB https://reviews.llvm.org/D85915 Files: lldb/test/API/macosx/find-dsym/bundle-with-dot-in-filename/TestBundleWithDotInFilename.py lldb/test/API/macosx/find-dsym/bundle-with-dot-in-filename/main.c lldb/test/API/macosx/find-dsym/deep-bundle/TestDeepBundle.py lldb/test/API/macosx/find-dsym/deep-bundle/main.c
Index: lldb/test/API/macosx/find-dsym/deep-bundle/main.c =================================================================== --- lldb/test/API/macosx/find-dsym/deep-bundle/main.c +++ lldb/test/API/macosx/find-dsym/deep-bundle/main.c @@ -13,6 +13,8 @@ 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 Index: lldb/test/API/macosx/find-dsym/deep-bundle/TestDeepBundle.py =================================================================== --- lldb/test/API/macosx/find-dsym/deep-bundle/TestDeepBundle.py +++ lldb/test/API/macosx/find-dsym/deep-bundle/TestDeepBundle.py @@ -31,14 +31,24 @@ @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 Index: lldb/test/API/macosx/find-dsym/bundle-with-dot-in-filename/main.c =================================================================== --- lldb/test/API/macosx/find-dsym/bundle-with-dot-in-filename/main.c +++ lldb/test/API/macosx/find-dsym/bundle-with-dot-in-filename/main.c @@ -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 @@ 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 Index: lldb/test/API/macosx/find-dsym/bundle-with-dot-in-filename/TestBundleWithDotInFilename.py =================================================================== --- lldb/test/API/macosx/find-dsym/bundle-with-dot-in-filename/TestBundleWithDotInFilename.py +++ lldb/test/API/macosx/find-dsym/bundle-with-dot-in-filename/TestBundleWithDotInFilename.py @@ -32,15 +32,25 @@ @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 @@ 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()
_______________________________________________ lldb-commits mailing list lldb-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits