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>