Bug 1301320 - Marionette should retry creating the server socket in case the port is in use. draft
authorHenrik Skupin <mail@hskupin.info>
Thu, 08 Sep 2016 13:49:09 +0200
changeset 411675 cd448ed2b799ce04bd316c965e007d7894e1e959
parent 411657 938ce16be25f9c551c19ef8938e8717ed3d41ff5
child 530786 23622217c47a671b3c4cd2e1f379dc59c61b05ef
push id28954
push userbmo:hskupin@gmail.com
push dateThu, 08 Sep 2016 13:19:15 +0000
bugs1301320
milestone51.0a1
Bug 1301320 - Marionette should retry creating the server socket in case the port is in use. MozReview-Commit-ID: DFTvw3HgrhN
testing/marionette/components/marionettecomponent.js
--- a/testing/marionette/components/marionettecomponent.js
+++ b/testing/marionette/components/marionettecomponent.js
@@ -207,31 +207,36 @@ MarionetteComponent.prototype.init = fun
     // This allows the following attempt by Marionette to open a socket
     // to succeed.
     let insaneSacrificialGoat =
         new ServerSocket(666, Ci.nsIServerSocket.KeepWhenOffline, 4);
     insaneSacrificialGoat.asyncListen(this);
   }
 
   let port = Preferences.get(PORT_PREF, DEFAULT_PORT);
+  let self = this;
 
-  let s;
-  try {
-    Cu.import("chrome://marionette/content/server.js");
-    s = new MarionetteServer(port, forceLocal);
-    s.start();
-    this.logger.info(`Listening on port ${s.port}`);
-  } catch (e) {
-    this.logger.error(`Error on starting server: ${e}`);
-    dump(e.toString() + "\n" + e.stack + "\n");
-  } finally {
-    if (s) {
-      this.server = s;
+  Cu.import("chrome://marionette/content/server.js");
+
+  function startServer() {
+    let server = new MarionetteServer(port, forceLocal);
+
+    try {
+      server.start();
+      self.server = server
+      self.logger.info(`Listening on port ${server.port}`);
+    } catch (e) {
+      self.logger.error(`Error when starting server on port ${server.port}: ${e}. Retrying...`);
+      dump(e.toString() + "\n" + e.stack + "\n");
+
+      let timer = Cc["@mozilla.org/timer;1"].createInstance(Ci.nsITimer);
+      timer.initWithCallback(startServer, 5000, Ci.nsITimer.TYPE_ONE_SHOT);
     }
-  }
+  };
+  startServer();
 };
 
 MarionetteComponent.prototype.uninit = function() {
   if (!this.loaded_) {
     return;
   }
   this.server.stop();
   this.loaded_ = false;