Workaround for simctl launch bug
authorjbedard@apple.com <jbedard@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Tue, 31 Jan 2017 04:50:40 +0000 (04:50 +0000)
committerjbedard@apple.com <jbedard@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Tue, 31 Jan 2017 04:50:40 +0000 (04:50 +0000)
https://bugs.webkit.org/show_bug.cgi?id=167613

Reviewed by Daniel Bates.

simctl launch will sometimes fail because of a race condition when many
simulators are being run simultaneously. These failures will always have
an exit code of 1. This change attempts to launch an app multiple times
before reporting a failure to workaround this bug.

* Scripts/webkitpy/xcode/simulator.py:
(Device.launch_app): Execute multiple launch attempts, better logging of failures.

git-svn-id: http://svn.webkit.org/repository/webkit/trunk@211405 268f45cc-cd09-0410-ab3c-d52691b4dbfc

Tools/ChangeLog
Tools/Scripts/webkitpy/xcode/simulator.py

index c554edf..9d6d778 100644 (file)
@@ -1,3 +1,18 @@
+2017-01-30  Jonathan Bedard  <jbedard@apple.com>
+
+        Workaround for simctl launch bug
+        https://bugs.webkit.org/show_bug.cgi?id=167613
+
+        Reviewed by Daniel Bates.
+
+        simctl launch will sometimes fail because of a race condition when many
+        simulators are being run simultaneously. These failures will always have
+        an exit code of 1. This change attempts to launch an app multiple times
+        before reporting a failure to workaround this bug.
+
+        * Scripts/webkitpy/xcode/simulator.py:
+        (Device.launch_app): Execute multiple launch attempts, better logging of failures.
+
 2017-01-30  Alexey Proskuryakov  <ap@apple.com>
 
         Commit queue fails to look at real name aliases for the reviewer
index b1127ec..4ebf566 100644 (file)
@@ -275,12 +275,22 @@ class Device(object):
             else:
                 environment_to_use[value] = env[value]
 
-        output = self._host.executive.run_command(
-            ['xcrun', 'simctl', 'launch', self.udid, bundle_id] + args,
-            env=environment_to_use,
-        )
+        # FIXME: This is a workaround for <rdar://problem/30273973>, Racey failure of simctl launch.
+        @staticmethod
+        def _log_debug_error(error):
+            _log.debug(error.message_with_output())
+
+        output = None
+        for x in xrange(3):
+            output = self._host.executive.run_command(
+                ['xcrun', 'simctl', 'launch', self.udid, bundle_id] + args,
+                env=environment_to_use,
+                error_handler=_log_debug_error,
+            )
+            match = re.match(r'(?P<bundle>[^:]+): (?P<pid>\d+)\n', output)
+            if match:
+                break
 
-        match = re.match(r'(?P<bundle>[^:]+): (?P<pid>\d+)\n', output)
         if not match or match.group('bundle') != bundle_id:
             raise RuntimeError('Failed to find process id for {}: {}'.format(bundle_id, output))
         return int(match.group('pid'))