RTCRtpSender-getStats.https.html (5364B)
1 <!doctype html> 2 <meta charset=utf-8> 3 <meta name="timeout" content="long"> 4 <title>RTCRtpSender.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 const { sender } = caller.addTransceiver(track); 21 22 exchangeIceCandidates(caller, callee); 23 await exchangeOfferAnswer(caller, callee); 24 const [ receiver ] = callee.getReceivers(); 25 await listenToConnected(callee); 26 await waitForTrackUnmuted(receiver.track); 27 const statsReport = await sender.getStats(); 28 assert_true(!![...statsReport.values()].find(({type}) => type === 'outbound-rtp')); 29 }, 'sender.getStats() via addTransceiver should return stats report containing outbound-rtp stats'); 30 31 promise_test(async t => { 32 const caller = new RTCPeerConnection(); 33 t.add_cleanup(() => caller.close()); 34 const callee = new RTCPeerConnection(); 35 t.add_cleanup(() => callee.close()); 36 const stream = await getNoiseStream({audio:true}); 37 t.add_cleanup(() => stream.getTracks().forEach(track => track.stop())); 38 const [track] = stream.getTracks(); 39 const sender = caller.addTrack(track, stream); 40 41 exchangeIceCandidates(caller, callee); 42 await exchangeOfferAnswer(caller, callee); 43 const [ receiver ] = callee.getReceivers(); 44 await listenToConnected(callee); 45 await waitForTrackUnmuted(receiver.track); 46 const statsReport = await sender.getStats(); 47 assert_true(!![...statsReport.values()].find(({type}) => type === 'outbound-rtp')); 48 }, 'sender.getStats() via addTrack should return stats report containing outbound-rtp stats'); 49 50 promise_test(async t => { 51 const caller = new RTCPeerConnection(); 52 t.add_cleanup(() => caller.close()); 53 const callee = new RTCPeerConnection(); 54 t.add_cleanup(() => callee.close()); 55 const stream = await getNoiseStream({audio:true}); 56 t.add_cleanup(() => stream.getTracks().forEach(track => track.stop())); 57 const [track] = stream.getTracks(); 58 caller.addTrack(track, stream); 59 60 exchangeIceCandidates(caller, callee); 61 await exchangeOfferAnswer(caller, callee); 62 const [ receiver ] = callee.getReceivers(); 63 await listenToConnected(callee); 64 await waitForTrackUnmuted(receiver.track); 65 66 const [sender] = caller.getSenders(); 67 const [transceiver] = caller.getTransceivers(); 68 const statsReportFirst = await sender.getStats(); 69 transceiver.stop(); 70 const statsReportSecond = await sender.getStats(); 71 assert_true(!![...statsReportFirst.values()].find(({type}) => type === 'outbound-rtp')); 72 assert_false(!![...statsReportSecond.values()].find(({type}) => type === 'outbound-rtp')); 73 }, 'sender.getStats() should work on a stopped transceiver but not have outbound-rtp stats'); 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 [sender] = caller.getSenders(); 91 const statsReportFirst = await sender.getStats(); 92 caller.close(); 93 const statsReportSecond = await sender.getStats(); 94 assert_true(!![...statsReportFirst.values()].find(({type}) => type === 'outbound-rtp')); 95 assert_false(!![...statsReportSecond.values()].find(({type}) => type === 'outbound-rtp')); 96 }, 'sender.getStats() should work with a closed PeerConnection but not have outbound-rtp objects'); 97 98 promise_test(async t => { 99 const caller = new RTCPeerConnection(); 100 t.add_cleanup(() => caller.close()); 101 const callee = new RTCPeerConnection(); 102 t.add_cleanup(() => callee.close()); 103 const stream = await getNoiseStream({audio:true}); 104 t.add_cleanup(() => stream.getTracks().forEach(track => track.stop())); 105 const [track] = stream.getTracks(); 106 const { sender } = caller.addTransceiver(track); 107 108 exchangeIceCandidates(caller, callee); 109 await exchangeOfferAnswer(caller, callee); 110 const [ receiver ] = callee.getReceivers(); 111 await listenToConnected(callee); 112 await waitForTrackUnmuted(receiver.track); 113 const statsReport = await sender.getStats(); 114 assert_true(!![...statsReport.values()].find(({type}) => type === 'candidate-pair')); 115 assert_true(!![...statsReport.values()].find(({type}) => type === 'local-candidate')); 116 assert_true(!![...statsReport.values()].find(({type}) => type === 'remote-candidate')); 117 }, 'sender.getStats() should return stats report containing ICE candidate stats'); 118 119 </script>