Bug 1346913 - rewrite waitForRtpFlow using async await;r?jib
MozReview-Commit-ID: AJq3x73ahwp
--- 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