<!doctype html>
<meta charset=utf-8>
<meta name="timeout" content="long">
<title>RTCRtpSender.prototype.getStats</title>
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script src="RTCPeerConnection-helper.js"></script>
<script src="dictionary-helper.js"></script>
<script src="RTCStats-helper.js"></script>
<script>
  'use strict';

  // Test is based on the following editor draft:
  // webrtc-pc 20171130
  // webrtc-stats 20171122

  // The following helper functions are called from RTCPeerConnection-helper.js:
  //   exchangeOfferAnswer

  // The following helper function is called from RTCStats-helper.js
  //   validateStatsReport
  //   assert_stats_report_has_stats

  /*
    5.2.  RTCRtpSender Interface
      getStats
        1.  Let selector be the RTCRtpSender object on which the method was invoked.
        2.  Let p be a new promise, and run the following steps in parallel:
          1.  Gather the stats indicated by selector according to the stats selection
              algorithm.
          2.  Resolve p with the resulting RTCStatsReport object, containing the
              gathered stats.
        3.  Return p.

    8.5. The stats selection algorithm
      3.  If selector is an RTCRtpSender, gather stats for and add the following objects
          to result:
        - All RTCOutboundRtpStreamStats objects corresponding to selector.
        - All stats objects referenced directly or indirectly by the RTCOutboundRtpStreamStats
          objects added.
   */

  promise_test(async t => {
    const caller = new RTCPeerConnection();
    t.add_cleanup(() => caller.close());
    const callee = new RTCPeerConnection();
    t.add_cleanup(() => callee.close());

    const stream = await getNoiseStream({audio:true});
    t.add_cleanup(() => stream.getTracks().forEach(track => track.stop()));
    const [track] = stream.getTracks();
    const { sender } = caller.addTransceiver(track);

    await exchangeOfferAnswer(caller, callee);
    const statsReport = await sender.getStats();
    validateStatsReport(statsReport);
    assert_stats_report_has_stats(statsReport, ['outbound-rtp']);
  }, 'sender.getStats() via addTransceiver should return stats report containing outbound-rtp stats');

  promise_test(async t => {
    const caller = new RTCPeerConnection();
    t.add_cleanup(() => caller.close());
    const callee = new RTCPeerConnection();
    t.add_cleanup(() => callee.close());
    const stream = await getNoiseStream({audio:true});
    t.add_cleanup(() => stream.getTracks().forEach(track => track.stop()));
    const [track] = stream.getTracks();
    const sender = caller.addTrack(track, stream);

    await exchangeOfferAnswer(caller, callee);
    const statsReport = await sender.getStats();
    validateStatsReport(statsReport);
    assert_stats_report_has_stats(statsReport, ['outbound-rtp']);
  }, 'sender.getStats() via addTrack should return stats report containing outbound-rtp stats');

  promise_test(async t => {
    const caller = new RTCPeerConnection();
    t.add_cleanup(() => caller.close());
    const callee = new RTCPeerConnection();
    t.add_cleanup(() => callee.close());
    const stream = await getNoiseStream({audio:true});
    t.add_cleanup(() => stream.getTracks().forEach(track => track.stop()));
    const [track] = stream.getTracks();
    const { sender } = caller.addTransceiver(track);

    exchangeIceCandidates(caller, callee);
    exchangeIceCandidates(callee, caller);
    await exchangeOfferAnswer(caller, callee);
    // Pairing should be possible as soon as we are 'checking', but to allow the
    // pairing to happen asynchronously, we wait until 'connected' or
    // 'completed' instead as it is not possible to reach these without a pair.
    await waitForIceStateChange(caller, ['connected', 'completed']);
    const statsReport = await sender.getStats();
    assert_stats_report_has_stats(statsReport, ['candidate-pair', 'local-candidate', 'remote-candidate']);
  }, 'sender.getStats() should return stats report containing ICE candidate stats');

</script>
