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
  • [Lldb-commits] [PATCH] ... Jonas Devlieghere via Phabricator via lldb-commits

Reply via email to