| <!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); |
| |
| async function countOutboundRtp() { |
| const stats = await localPc.getStats(); |
| return [...stats.values()] |
| .filter(({ type }) => type == "outbound-rtp").length; |
| } |
| |
| assert_equals(await countOutboundRtp(), 0, |
| "No outbound rtp stats before setLocalDescription"); |
| await localPc.setLocalDescription(); |
| const p = remotePc.setRemoteDescription(localPc.localDescription); |
| assert_equals(await countOutboundRtp(), 0, |
| "No outbound rtp stats after setLocalDescription but before setRemoteDescription"); |
| await p; |
| await remotePc.setLocalDescription(); |
| await localPc.setRemoteDescription(remotePc.localDescription); |
| |
| const start = performance.now(); |
| while (true) { |
| if (await countOutboundRtp() == 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 RTCRtpOutboundStreamStats should exist before negotiation completes"); |
| |
| 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> |