<!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>
