<!doctype html> <meta charset=utf-8> <title>No RTCRtpStreamStats should exist prior to RTP/RTCP packet flow</title> <script src="/resources/testharness.js"></script> <script src="/resources/testharnessreport.js"></script> <script src="../webrtc/RTCPeerConnection-helper.js"></script> <script> 'use strict'; promise_test(async (test) => { const localPc = createPeerConnectionWithCleanup(test); const remotePc = createPeerConnectionWithCleanup(test); localPc.addTransceiver("audio"); localPc.addTransceiver("video"); await exchangeOfferAndListenToOntrack(test, localPc, remotePc); const report = await remotePc.getStats(); const rtp = [...report.values()].filter(({type}) => type.endsWith("rtp")); assert_equals(rtp.length, 0, "no rtp stats with only remote description"); }, "No RTCRtpStreamStats exist when only remote description is set"); promise_test(async (test) => { const localPc = createPeerConnectionWithCleanup(test); const remotePc = createPeerConnectionWithCleanup(test); localPc.addTrack(...await createTrackAndStreamWithCleanup(test, "audio")); localPc.addTrack(...await createTrackAndStreamWithCleanup(test, "video")); await exchangeOfferAndListenToOntrack(test, localPc, remotePc); const report = await localPc.getStats(); const rtp = [...report.values()].filter(({type}) => type.endsWith("rtp")); assert_equals(rtp.length, 0, "no rtp stats with only local description"); }, "No RTCRtpStreamStats exist when only local description is set"); promise_test(async (test) => { const localPc = createPeerConnectionWithCleanup(test); const remotePc = createPeerConnectionWithCleanup(test); localPc.addTrack(...await createTrackAndStreamWithCleanup(test, "audio")); localPc.addTrack(...await createTrackAndStreamWithCleanup(test, "video")); exchangeIceCandidates(localPc, remotePc); await Promise.all([ exchangeOfferAnswer(localPc, remotePc), new Promise(r => remotePc.ontrack = e => e.track.onunmute = r) ]); const start = performance.now(); while (true) { const report = await localPc.getStats(); const outbound = [...report.values()].filter(({type}) => type == "outbound-rtp"); assert_true(outbound.every(({packetsSent}) => packetsSent > 0), "no outbound rtp stats before packets sent"); if (outbound.length == 2) { // One outbound stat for each track is present. We're done. break; } if (performance.now() > start + 5000) { assert_unreached("outbound stats should become available"); } await new Promise(r => test.step_timeout(r, 100)); } }, "No RTCOutboundRtpStreamStats exist until packets have been sent"); promise_test(async (test) => { const localPc = createPeerConnectionWithCleanup(test); const remotePc = createPeerConnectionWithCleanup(test); localPc.addTrack(...await createTrackAndStreamWithCleanup(test, "audio")); localPc.addTrack(...await createTrackAndStreamWithCleanup(test, "video")); exchangeIceCandidates(localPc, remotePc); await exchangeOfferAnswer(localPc, remotePc); const start = performance.now(); while (true) { const report = await remotePc.getStats(); const inbound = [...report.values()].filter(({type}) => type == "inbound-rtp"); assert_true(inbound.every(({packetsReceived}) => packetsReceived > 0), "no inbound rtp stats before packets received"); if (inbound.length == 2) { // One inbound stat for each track is present. We're done. break; } if (performance.now() > start + 5000) { assert_unreached("inbound stats should become available"); } await new Promise(r => test.step_timeout(r, 100)); } }, "No RTCInboundRtpStreamStats exist until packets have been received"); promise_test(async (test) => { const localPc = createPeerConnectionWithCleanup(test); const remotePc = createPeerConnectionWithCleanup(test); localPc.addTrack(...await createTrackAndStreamWithCleanup(test, "audio")); exchangeIceCandidates(localPc, remotePc); await exchangeOfferAnswer(localPc, remotePc); const start = performance.now(); while (true) { const report = await remotePc.getStats(); const audioPlayout = [...report.values()].filter(({type}) => type == "media-playout"); if (audioPlayout.length == 1) { break; } if (performance.now() > start + 5000) { assert_unreached("Audio playout stats should become available"); } await new Promise(r => test.step_timeout(r, 100)); } }, "RTCAudioPlayoutStats should be present"); </script>