Bug 1469054 - Make check() in adb-running-checker fail if a certain period of time elapsed. r?jdescottes draft
authorHiroyuki Ikezoe <hikezoe@mozilla.com>
Thu, 09 Aug 2018 15:43:44 +0900
changeset 827792 f10bec1379b96d7487aee9572d1df1bcdcfa67d1
parent 827791 5711a5c7f5b30e2b0d0ee2ed6077b2032039a5e0
child 827793 938fe3b313597bc0eae6ebcadd56a84460738a7c
push id118584
push userhikezoe@mozilla.com
push dateThu, 09 Aug 2018 06:45:13 +0000
reviewersjdescottes
bugs1469054, 1481963
milestone63.0a1
Bug 1469054 - Make check() in adb-running-checker fail if a certain period of time elapsed. r?jdescottes On MacOSX connecting to a port which is not started listening gets stuck (bug 1481963), to avoid the stuck, we make forcibly the function fail. MozReview-Commit-ID: COVplVPx3vA
devtools/shared/adb/adb-running-checker.js
--- a/devtools/shared/adb/adb-running-checker.js
+++ b/devtools/shared/adb/adb-running-checker.js
@@ -10,52 +10,67 @@
 
 "use strict";
 
 const client = require("./adb-client");
 
 exports.check = async function check() {
   let socket;
   let state;
+  let timerID;
+  const TIMEOUT_TIME = 1000;
 
   console.debug("Asking for host:version");
 
   return new Promise(resolve => {
+    // On MacOSX connecting to a port which is not started listening gets
+    // stuck (bug 1481963), to avoid the stuck, we do forcibly fail the
+    // connection after |TIMEOUT_TIME| elapsed.
+    timerID = setTimeout(() => {
+      socket.close();
+      resolve(false);
+    }, TIMEOUT_TIME);
+
+    function finish(returnValue) {
+      clearTimeout(timerID);
+      resolve(returnValue);
+    }
+
     const runFSM = function runFSM(packetData) {
       console.debug("runFSM " + state);
       switch (state) {
         case "start":
           const req = client.createRequest("host:version");
           socket.send(req);
           state = "wait-version";
           break;
         case "wait-version":
           // TODO: Actually check the version number to make sure the daemon
           //       supports the commands we want to use
           const { length, data } = client.unpackPacket(packetData);
           console.debug("length: ", length, "data: ", data);
           socket.close();
           const version = parseInt(data, 16);
           if (version >= 31) {
-            resolve(true);
+            finish(true);
           } else {
             console.log("killing existing adb as we need version >= 31");
-            resolve(false);
+            finish(false);
           }
           break;
         default:
           console.debug("Unexpected State: " + state);
-          resolve(false);
+          finish(false);
       }
     };
 
     const setupSocket = function() {
       socket.s.onerror = function(event) {
         console.debug("running checker onerror");
-        resolve(false);
+        finish(false);
       };
 
       socket.s.onopen = function(event) {
         console.debug("running checker onopen");
         state = "start";
         runFSM();
       };