tor-browser

The Tor Browser
git clone https://git.dasho.dev/tor-browser.git
Log | Files | Refs | README | LICENSE

test_peerConnection_sender_and_receiver_stats.html (2759B)


      1 <!DOCTYPE HTML>
      2 <html>
      3 <head>
      4  <script type="application/javascript" src="pc.js"></script>
      5  <script type="application/javascript" src="stats.js"></script>
      6 </head>
      7 <body>
      8 <pre id="test">
      9 <script type="application/javascript">
     10  createHTML({
     11    bug: "1355220",
     12    title: "RTCRtpSender.getStats() and RTCRtpReceiver.getStats()",
     13    visible: true
     14  });
     15 
     16  const checkStats = (sndReport, rcvReport, kind) => {
     17    ok(sndReport instanceof window.RTCStatsReport, "sender stats are a RTCStatsReport");
     18    ok(rcvReport instanceof window.RTCStatsReport, "receiver stats are a RTCStatsReport");
     19    // Returns SSRCs and performs some checks
     20    let getSsrcs = (report, kind) => {
     21      return [...report.values()]
     22        .filter(stat => stat.type.endsWith("bound-rtp")).map(stat =>{
     23          isnot(parseInt(stat.id, 16), NaN,
     24            `id ${stat.id} is an opaque (hex) number`);
     25          is(stat.kind, kind, "kind of " + stat.id
     26              + " is expected type " + kind);
     27          return stat.ssrc;
     28      }).sort().join("|");
     29    };
     30    let sndSsrcs = getSsrcs(sndReport, kind);
     31    let rcvSsrcs = getSsrcs(rcvReport, kind);
     32    ok(sndSsrcs, "sender SSRCs is not empty");
     33    ok(rcvSsrcs, "receiver SSRCs is not empty");
     34    is(sndSsrcs, rcvSsrcs, "sender SSRCs match receiver SSRCs");
     35  };
     36 
     37  // This MUST be run after PC_*_WAIT_FOR_MEDIA_FLOW to ensure that we have RTP
     38  // before checking for RTCP.
     39  // It will throw UnsyncedRtcpError if it times out waiting for sync.
     40 
     41  runNetworkTest(function (options) {
     42    test = new PeerConnectionTest(options);
     43    test.chain.insertAfter("PC_REMOTE_WAIT_FOR_MEDIA_FLOW",
     44      async function PC_LOCAL_AND_REMOTE_CHECK_SENDER_RECEIVER_STATS(test) {
     45        await Promise.all([
     46          waitForSyncedRtcp(test.pcLocal._pc),
     47          waitForSyncedRtcp(test.pcRemote._pc),
     48        ]);
     49        let senders = test.pcLocal.getSenders();
     50        let receivers = test.pcRemote.getReceivers();
     51        is(senders.length, 2, "Have exactly two senders.");
     52        is(receivers.length, 2, "Have exactly two receivers.");
     53        for(let kind of ["audio", "video"]) {
     54          let senderStats =
     55              await senders.find(s => s.track.kind == kind).getStats();
     56          is(senders.filter(s => s.track.kind == kind).length, 1,
     57              "Exactly 1 sender of kind " + kind);
     58          let receiverStats =
     59              await receivers.find(r => r.track.kind == kind).getStats();
     60          is(receivers.filter(r => r.track.kind == kind).length, 1,
     61              "Exactly 1 receiver of kind " + kind);
     62 
     63          checkStats(senderStats, receiverStats, kind);
     64        }
     65      }
     66    );
     67    test.setMediaConstraints([{audio: true}, {video: true}], []);
     68    return test.run();
     69  });
     70 </script>
     71 </pre>
     72 </body>
     73 </html>