RTCRtpReceiver-getStats.https.html (5301B)
1 <!doctype html> 2 <meta charset=utf-8> 3 <meta name="timeout" content="long"> 4 <title>RTCRtpReceiver.prototype.getStats</title> 5 <script src="/resources/testharness.js"></script> 6 <script src="/resources/testharnessreport.js"></script> 7 <script src="RTCPeerConnection-helper.js"></script> 8 <script> 9 'use strict'; 10 11 promise_test(async t => { 12 const caller = new RTCPeerConnection(); 13 t.add_cleanup(() => caller.close()); 14 const callee = new RTCPeerConnection(); 15 t.add_cleanup(() => callee.close()); 16 17 const stream = await getNoiseStream({audio:true}); 18 t.add_cleanup(() => stream.getTracks().forEach(track => track.stop())); 19 const [track] = stream.getTracks(); 20 callee.addTrack(track, stream); 21 22 const { receiver } = caller.addTransceiver('audio'); 23 24 exchangeIceCandidates(caller, callee); 25 await exchangeOfferAnswer(caller, callee); 26 await listenToConnected(callee); 27 await waitForTrackUnmuted(receiver.track); 28 const statsReport = await receiver.getStats(); 29 assert_true(!![...statsReport.values()].find(({type}) => type === 'inbound-rtp')); 30 }, 'receiver.getStats() via addTransceiver should return stats report containing inbound-rtp stats'); 31 32 promise_test(async t => { 33 const caller = new RTCPeerConnection(); 34 t.add_cleanup(() => caller.close()); 35 const callee = new RTCPeerConnection(); 36 t.add_cleanup(() => callee.close()); 37 const stream = await getNoiseStream({audio:true}); 38 t.add_cleanup(() => stream.getTracks().forEach(track => track.stop())); 39 const [track] = stream.getTracks(); 40 caller.addTrack(track, stream); 41 42 exchangeIceCandidates(caller, callee); 43 await exchangeOfferAnswer(caller, callee); 44 const receiver = callee.getReceivers()[0]; 45 await listenToConnected(callee); 46 await waitForTrackUnmuted(receiver.track); 47 const statsReport = await receiver.getStats(); 48 assert_true(!![...statsReport.values()].find(({type}) => type === 'inbound-rtp')); 49 }, 'receiver.getStats() via addTrack should return stats report containing inbound-rtp stats'); 50 51 promise_test(async t => { 52 const caller = new RTCPeerConnection(); 53 t.add_cleanup(() => caller.close()); 54 const callee = new RTCPeerConnection(); 55 t.add_cleanup(() => callee.close()); 56 const stream = await getNoiseStream({audio:true}); 57 t.add_cleanup(() => stream.getTracks().forEach(track => track.stop())); 58 const [track] = stream.getTracks(); 59 caller.addTrack(track, stream); 60 61 exchangeIceCandidates(caller, callee); 62 await exchangeOfferAnswer(caller, callee); 63 const [receiver] = callee.getReceivers(); 64 await listenToConnected(callee); 65 await waitForTrackUnmuted(receiver.track); 66 const [transceiver] = callee.getTransceivers(); 67 const statsPromiseFirst = receiver.getStats(); 68 transceiver.stop(); 69 const statsReportFirst = await statsPromiseFirst; 70 const statsReportSecond = await receiver.getStats(); 71 assert_true(!![...statsReportFirst.values()].find(({type}) => type === 'inbound-rtp')); 72 assert_false(!![...statsReportSecond.values()].find(({type}) => type === 'inbound-rtp')); 73 }, 'receiver.getStats() should work on a stopped transceiver but not have inbound-rtp objects'); 74 75 promise_test(async t => { 76 const caller = new RTCPeerConnection(); 77 t.add_cleanup(() => caller.close()); 78 const callee = new RTCPeerConnection(); 79 t.add_cleanup(() => callee.close()); 80 const stream = await getNoiseStream({audio:true}); 81 t.add_cleanup(() => stream.getTracks().forEach(track => track.stop())); 82 const [track] = stream.getTracks(); 83 caller.addTrack(track, stream); 84 85 exchangeIceCandidates(caller, callee); 86 await exchangeOfferAnswer(caller, callee); 87 const [receiver] = callee.getReceivers(); 88 await listenToConnected(callee); 89 await waitForTrackUnmuted(receiver.track); 90 const statsReportFirst = await receiver.getStats(); 91 callee.close(); 92 const statsReportSecond = await receiver.getStats(); 93 assert_true(!![...statsReportFirst.values()].find(({type}) => type === 'inbound-rtp')); 94 assert_false(!![...statsReportSecond.values()].find(({type}) => type === 'inbound-rtp')); 95 }, 'receiver.getStats() should work with a closed PeerConnection but not have inbound-rtp objects'); 96 97 promise_test(async t => { 98 const caller = new RTCPeerConnection(); 99 t.add_cleanup(() => caller.close()); 100 const callee = new RTCPeerConnection(); 101 t.add_cleanup(() => callee.close()); 102 const stream = await getNoiseStream({audio:true}); 103 t.add_cleanup(() => stream.getTracks().forEach(track => track.stop())); 104 const [track] = stream.getTracks(); 105 caller.addTrack(track, stream); 106 107 exchangeIceCandidates(caller, callee); 108 await exchangeOfferAnswer(caller, callee); 109 const receiver = callee.getReceivers()[0]; 110 await listenToConnected(callee); 111 await waitForTrackUnmuted(receiver.track); 112 const statsReport = await receiver.getStats(); 113 assert_true(!![...statsReport.values()].find(({type}) => type === 'candidate-pair')); 114 assert_true(!![...statsReport.values()].find(({type}) => type === 'local-candidate')); 115 assert_true(!![...statsReport.values()].find(({type}) => type === 'remote-candidate')); 116 }, 'receiver.getStats() should return stats report containing ICE candidate stats'); 117 118 </script>