Bug 1346913 - rewrite waitForRtpFlow using async await;r?jib draft
authorNico Grunbaum
Mon, 13 Mar 2017 12:54:04 -0700
changeset 497901 c8728718c5c3e7f372c13b4023c5bcafe3b6c321
parent 497747 950180909fd0e5031a04fcd4cb8f94ff4be72ae6
child 549040 6eba99049e62c5e1df172d023813c1672008b510
push id49064
push userna-g@nostrum.com
push dateTue, 14 Mar 2017 02:25:07 +0000
reviewersjib
bugs1346913
milestone55.0a1
Bug 1346913 - rewrite waitForRtpFlow using async await;r?jib MozReview-Commit-ID: AJq3x73ahwp
dom/media/tests/mochitest/pc.js
--- a/dom/media/tests/mochitest/pc.js
+++ b/dom/media/tests/mochitest/pc.js
@@ -1420,75 +1420,52 @@ PeerConnectionWrapper.prototype = {
   },
 
   /**
    * Wait for RTP packet flow for the given MediaStreamTrack.
    *
    * @param {object} track
    *        A MediaStreamTrack to wait for data flow on.
    * @returns {Promise}
-   *        A promise that resolves when media is flowing.
+   *        Returns a promise which yields a StatsReport object with RTP stats.
    */
-  waitForRtpFlow(track) {
-    var hasFlow = (stats, retries) => {
+  async waitForRtpFlow(track) {
+    let hasFlow = (stats, retries) => {
       info("Checking for stats in " + JSON.stringify(stats) + " for " + track.kind
         + " track " + track.id + ", retry number " + retries);
-      var rtp = stats.get([...Object.keys(stats)].find(key =>
+      let rtp = stats.get([...Object.keys(stats)].find(key =>
         !stats.get(key).isRemote && stats.get(key).type.endsWith("bound-rtp")));
       if (!rtp) {
-
         return false;
       }
       info("Should have RTP stats for track " + track.id);
-      info("RTP stats: "+JSON.stringify(rtp));
-      var nrPackets = rtp[rtp.type == "outbound-rtp" ? "packetsSent"
+      info("RTP stats: " + JSON.stringify(rtp));
+      let nrPackets = rtp[rtp.type == "outbound-rtp" ? "packetsSent"
                                                     : "packetsReceived"];
       info("Track " + track.id + " has " + nrPackets + " " +
            rtp.type + " RTP packets.");
       return nrPackets > 0;
     };
 
     // Time between stats checks
-    var retryInterval = 500;
+    const retryInterval = 500;
     // Timeout in ms
-    var timeoutInterval = 30000;
+    const timeout = 30000;
+    let retry = 0;
     // Check hasFlow at a reasonable interval
-    var checkStats = new Promise((resolve, reject)=>{
-      var retries = 0;
-      var timer = setInterval(()=>{
-        this._pc.getStats(track).then(stats=>{
-          if (hasFlow(stats, retries)) {
-            clearInterval(timer);
-            ok(true, "RTP flowing for " + track.kind + " track " + track.id);
-            resolve();
-          }
-          retries = retries + 1;
-          // This is not accurate but it will tear down
-          // the timer eventually and probably not
-          // before timeoutInterval has elapsed.
-          if ((retries * retryInterval) > timeoutInterval) {
-            clearInterval(timer);
-          }
-        });
-      }, retryInterval);
-    });
-
-    info("Checking RTP packet flow for track " + track.id);
-    var retry = Promise.race([checkStats.then(new Promise((resolve, reject)=>{
-        info("checkStats completed for " + track.kind + " track " + track.id);
-        resolve();
-      })),
-      new Promise((accept,reject)=>wait(timeoutInterval).then(()=>{
-        info("Timeout checking for stats for track " + track.id + " after " + timeoutInterval + "ms");
-        reject("Timeout checking for stats for " + track.kind
-          + " track " + track.id + " after " + timeoutInterval + "ms");
-      })
-    )]);
-
-    return retry;
+    for (let remaining = timeout; remaining >= 0; remaining -= retryInterval) {
+      let stats = await this._pc.getStats(track);
+      if (hasFlow(stats, retry++)) {
+        ok(true, "RTP flowing for " + track.kind + " track " + track.id);
+        return stats;
+      }
+      await wait(retryInterval);
+    }
+    throw new Error("Timeout checking for stats for track " + track.id
+                    + " after at least" + timeout + "ms");
   },
 
   /**
    * Wait for presence of video flow on all media elements and rtp flow on
    * all sending and receiving track involved in this test.
    *
    * @returns {Promise}
    *        A promise that resolves when media flows for all elements and tracks